为什么这个php代码不工作时,试图删除脚本标签


Why this php code not work when tried to remove script tag?

通常我使用这段代码来删除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>,标记脚本部分的结束
注意,我正在转义斜杠('/而不是/),因为/是这里的正则分隔符字符。我们也可以在正则表达式的开头和结尾使用不同的字符,比如#,这样/就不必转义了。

牛;最后,我添加了si修饰符。s使其解析多行内容。Javascript代码当然可以包含换行符,我们希望.*?也能匹配这些。i使其不区分大小写,因为我假设您也想替换<Script><SCRIPT>