在PHP中處理HTML內容時,常常需要提取特定標簽的屬性值,例如style、class、href、target、alt等。 同時,我們也需要去除一些不必要的屬性,例如潛在風險屬性onload等,以增強安全性。
問題:
如何編寫一個PHP函數,能夠有效地過濾HTML代碼,提取指定的屬性,并去除諸如onload之類的有害屬性?例如,對于12313123?,只保留style和class屬性,去除onload屬性。
立即學習“PHP免費學習筆記(深入)”;
解決方案:
直接使用單個正則表達式匹配所有目標屬性并同時去除不需要的屬性,會使正則表達式過于復雜且難以維護。更有效的方法是采用兩步走策略:
-
去除不需要的屬性: 使用正則表達式去除所有以on開頭的屬性(例如onload、onclick等)。
-
提取需要的屬性: (此步驟可根據需求使用正則表達式或其他方法,此處略去,因為題目重點在于去除有害屬性)
以下代碼演示了如何使用正則表達式去除on開頭的屬性:
$html = '<strong class="123" onload="asdasdas()" style="white-space: normal;">12313123?</strong><div class="ccc">aaaaa</div> <p style="white-space: normal;">bbbbb</p> <strong class="123" onload="asdasdas()" style="white-space: normal;">12313123?</strong> <strong onload="'asdasdas()'">eeeeee?</strong><a class="aaaa" href="https://www.php.cn/link/56613d94c5eec17e84ddc87eb39b72ea" target="_blank">鏈接鏈接</a><p>ffff</p>'; $pattern = '/bonw+=(['"]).*?1/mi'; // 匹配并去除所有以on開頭的屬性 $cleanedHtml = preg_replace($pattern, '', $html); echo "清理后的HTML代碼:n" . $cleanedHtml;
代碼解釋:
-
/bonw+=([‘”]).*?1/mi:這個正則表達式匹配以on開頭的屬性。
- b: 單詞邊界,確保匹配的是完整的屬性名。
- onw+: 匹配on后跟一個或多個單詞字符的屬性名。
- ([‘”]): 捕獲屬性值引號(單引號或雙引號)。
- .*?: 非貪婪匹配屬性值內容。
- 1: 反向引用,確保屬性值引號匹配。
- m: 多行模式,使^和$匹配每一行而不是整個字符串。
- i: 大小寫不敏感模式。
-
preg_replace($pattern, ”, $html): 將匹配到的部分替換為空字符串,從而去除不需要的屬性。
這種兩步走策略比試圖用一個復雜的正則表達式完成所有操作更清晰、更易于維護,也更安全可靠。 后續可以根據需求添加提取所需屬性的代碼。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END