为什么这个PHP代码在尝试删除脚本标记时不起作用?

时间:2016-11-17 16:15:34

标签: php

通常我使用此代码删除所有数据内部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;
?>

当测试代码时,它不会删除数据内部脚本标记。为什么?

1 个答案:

答案 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>标记脚本部分的结尾 请注意,我正在使用斜杠(\/而不是/),因为此处/是正则表达式分隔符。我们也可以在正则表达式的开头和结尾处使用不同的字符,例如#,然后/不必转义。

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