在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