通常我使用此代码删除所有数据内部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;
?>
当测试代码时,它不会删除数据内部脚本标记。为什么?
答案 0 :(得分:1)
您的代码无效,因为您正在解析<scrip
,后跟零{或}个字符,而不是>
,后跟script>
。
您的内容中没有此类子字符串。在您的$ string中,<scrip
之后您有一个t
(与[^>]+
匹配),然后您有一个>
而不是script>
。所以,没有比赛。
以下是您需要做的事情:
$string = preg_replace("/<script.*?<\/script>/si", "", $string);
您无法使用[^<]
或[^>]
,因为javascript代码本身可能包含许多<
和>
个字符。
以上是正则表达式的作用:
•搜索<script
我故意没有在此处包含结束>
括号,因为您可能在脚本标记中有一些属性,例如<script type='text/javascript'>
•使用lazy evaluation来跟随任意随机字符序列
请注意.*?
而不是.*
,这会将 little 字符捕获为尽可能找到匹配项,而不是尽可能多。这避免了以下问题:
<script>something</script> other content <script>more script</script>
如果没有延迟评估,它会从第一个<script>
到最后一个</script>
•后跟</script>
标记脚本部分的结尾
请注意,我正在使用斜杠(\/
而不是/
),因为此处/
是正则表达式分隔符。我们也可以在正则表达式的开头和结尾处使用不同的字符,例如#
,然后/
不必转义。
•最后,我添加了s
和i
修饰符。 s
使其解析多行内容。 Javascript代码当然可以包含换行符,我们希望.*?
也匹配。并i
使其不区分大小写,因为我假设您也想要替换<Script>
或<SCRIPT>
。