PHP删除相邻的关闭和打开脚本标记

时间:2015-04-17 19:19:55

标签: php html regex replace

说我有

<script>alert("hello");</script><script>alert("world");</script>

如何删除</script><script>,请记住中间可能存在或可能没有空格(</script> <script>),如果其中一个脚本标记包含空格,我就不想这样做源属性(src)设置。

这应该与尽可能多的脚本标记一起使用,因此如果连续三个遵循相同的要求,它将被转换为一个大的脚本标记。

3 个答案:

答案 0 :(得分:2)

你声明可能有&#34; a&#34;空间。如果是这种情况,您有两种情况:</script><script></script> <script>。您可以使用空格轻松替换它们:

$html = str_replace('</script><script>',' ',$html);
$html = str_replace('</script> <script>',' ',$html);

但是,如果有很多空白怎么办?标签,换行符等......都加起来就是空格。你可以preg_replace(不用正则表达式解析HTML - 它只是替换一个明确定义的字符串)。

$html = preg_replace('~</script>\s*<script>~',' ',$html);

注意:如果第二个&lt; script&gt;实际上是&lt; script src =&#39; blahblahblah&#39;&gt;,它使用str_replace或preg_replace不匹配。这不是问题。

答案 1 :(得分:1)

使用

 $pattern="/<script[^s>]*>\s*<\/script>/isU";
 $html=preg_replace($pattern,"",$html);

模式查找没有src属性的脚本标记基本上我们发现它是否有内部,并删除该脚本打开和关闭标记分隔零或更多空间

答案 2 :(得分:0)

@ kainaw的答案是正确的,但我在这里有一个复杂的版本,你可以只允许一些标签,并返回它们之间存在的空间。

function remove_same_openclosed_tags($matches){
  $allowed_tags = ['em', 'u', 'span', 'strong', 'script'];
  if(in_array($matches[1], $allowed_tags) && $matches[1] == $matches[3] ) {
    return $matches[2];
  }
  return $matches[0];
}
$content = preg_replace_callback("/<\/([a-zA-Z]+?)>(\s*)<([a-zA-Z]+?)>/is", 'remove_same_openclosed_tags' , $content);