在PHP中处理字符串时,经常需要对HTML代码中的特定标签内容进行替换。特别是在处理安全性相关的内容时,比如清理或修改 <script> 标签内的内容,避免XSS攻击。本文将介绍如何使用 mb_eregi_replace 函数来实现对HTML标签中特定内容的替换。
mb_eregi_replace 是PHP中多字节字符串函数的一部分,支持正则表达式的不区分大小写替换功能。相比传统的 eregi_replace,它能够更好地处理UTF-8等多字节编码,适合处理中文及其他多字节字符集。
函数原型如下:
string mb_eregi_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] )
$pattern:正则表达式模式(不区分大小写)
$replacement:替换内容
$string:输入字符串
$option:可选参数,默认是 "msr",表示多行模式、单行模式、支持UTF-8等
目标是匹配所有 <script> 标签内的内容,然后用自定义的字符串替换,避免直接执行或显示脚本内容。示例代码如下:
<?php
// 原始HTML字符串,包含<script>标签
$html = '<div>示例内容<script>alert("危险脚本");</script>更多内容</div>';
// 使用 mb_eregi_replace 替换 <script> 标签中的内容
// 正则表达式说明:
// <script[^>]*> 匹配<script>标签的开始,允许带属性
// .*? 非贪婪匹配<script>和</script>之间的所有内容
// </script> 匹配结束标签
$pattern = '<script[^>]*>.*?</script>';
// 替换为安全提示或空内容
$replacement = '<script>/* 脚本内容已被替换 */</script>';
// 执行替换
$safe_html = mb_eregi_replace($pattern, $replacement, $html);
echo $safe_html;
?>
输出结果:
<div>示例内容<script>/* 脚本内容已被替换 */</script>更多内容</div>
mb_eregi_replace 默认不区分大小写,所以无论是 <script> 还是 <SCRIPT> 都能匹配。
正则中的 .*? 是非贪婪模式,确保匹配到第一个 </script> 标签结束,避免匹配多余内容。
如果需要匹配多行脚本内容,确保正则选项支持单行模式(.匹配换行符),默认为msr即可。
假如你想替换 <script> 标签内的 URL,将所有URL中的域名替换为 m66.net,可以结合回调函数处理:
<?php
$html = '<script src="http://example.com/js/app.js"></script>';
// 先匹配<script>标签
$pattern = '<script[^>]*>.*?</script>';
$safe_html = mb_eregi_replace($pattern, function($matches) {
$script_tag = $matches[0];
// 替换 URL 域名为 m66.net,使用简单的正则替换
$script_tag = preg_replace('#(https?://)([^/]+)#i', '$1m66.net', $script_tag);
return $script_tag;
}, $html);
echo $safe_html;
?>
输出:
相关标签:
HTML