通常我使用这段代码来删除img标签内的所有数据。这工作很好。
<?PHP
$string = "<b>test</b><img src='"https://www.google.co.th/images/nav_logo242.png'"><script>alert();</script>";
$string = preg_replace("/<img[^>]+>/", "", $string);
echo $string;
?>
然后我应用代码删除所有数据内脚本标签。这是我的代码。
<?PHP
$string = "<b>test</b><img src='"https://www.google.co.th/images/nav_logo242.png'"><script>alert();</script>";
$string = preg_replace("/<scrip[^>]+script>/", "", $string);
echo $string;
?>
当测试代码时,它不删除数据内部脚本标签。为什么?
您的代码不起作用,因为您正在解析<scrip
,后面跟着零或多个字符,而不是>
,然后是script>
。
在您的内容中没有这样的子字符串。在您的$字符串中,在<scrip
之后,您有t
(与[^>]+
匹配),然后您有>
而不是script>
。所以,没有匹配。
你需要做的是:
$string = preg_replace("/<script.*?<'/script>/si", "", $string);
不能使用[^<]
或[^>]
,因为javascript代码本身可能包含许多<
和>
字符。
上面的正则表达式是这样做的:
牛;搜索<script
我故意在这里不包括结束的>
括号,因为也许你在脚本标签中有一些属性,比如<script type='text/javascript'>
牛;后面跟着任意随机字符序列,使用延迟求值
注意.*?
而不是.*
,它捕获尽可能小的字符以找到匹配,而不是尽可能多的字符。这避免了以下问题:<script>something</script> other content <script>more script</script>
如果没有延迟求值,它将删除从第一个<script>
到最后一个</script>
的所有
牛;然后是</script>
,标记脚本部分的结束
注意,我正在转义斜杠('/
而不是/
),因为/
是这里的正则分隔符字符。我们也可以在正则表达式的开头和结尾使用不同的字符,比如#
,这样/
就不必转义了。
牛;最后,我添加了s
和i
修饰符。s
使其解析多行内容。Javascript代码当然可以包含换行符,我们希望.*?
也能匹配这些。i
使其不区分大小写,因为我假设您也想替换<Script>
或<SCRIPT>
。