使用正则表达式删除多行脚本

时间:2016-09-23 09:46:16

标签: php preg-replace preg-replace-callback

我有以下脚本,可以在帖子中多次出现

<script type='text/javascript'>
    if(typeof(jQuery)=="function"){(function($){$.fn.fitVids=function(){}})(jQuery)};
    customfunction('customfunction_div').setup(
    {"playlist":"customfunction\/jw6\/eM0MzdZ2.xml"}
);
</script>

我想在preg_replace或preg_replace_callback中使用正则表达式删除这些脚本的出现,如果可能的话,还要检查 customfunction_div 是否至少存在于脚本中一次。 请帮忙!

1 个答案:

答案 0 :(得分:0)

您应该使用->toSql()等正确的工具解析HTML,而不是依赖正则表达式。

以下是一个代码段,展示了如何抓取内部包含单词DOMDocument的{​​{1}}代码并将其删除:

script

请参阅PHP demo

此处,customfunction_div是一个XPath表达式,用于抓取包含 customfunction_div 的内容($html = "<html><head><script type='text/javascript'>\n if(typeof(jQuery)==\"function\"){(function(\$){\$.fn.fitVids=function(){}})(jQuery)};\n customfunction('cu').setup(\n {\"playlist\":\"customfunction\/jw6\/eM0MzdZ2.xml\"}\n);\n</script>\n\n<script type='text/javascript'>\n if(typeof(jQuery)==\"function\"){(function(\$){\$.fn.fitVids=function(){}})(jQuery)};\n customfunction('customfunction_div').setup(\n {\"playlist\":\"customfunction\/jw6\/eM0MzdZ2.xml\"}\n);\n</script></head><body>TEXT</body></html>"; $dom = new DOMDocument; $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); $xp = new DOMXPath($dom); $scripts = $xp->query('//script[contains(.,"customfunction_div")]'); foreach ($scripts as $script) { $script->parentNode->removeChild($script); } echo $dom->saveHTML(); )的//script[contains(.,"customfunction_div")]标记。

如果您坚持使用正则表达式,'~<script\b(?:(?!</?script[\s>]).)*customfunction_div.*?</script>~s'模式在大多数情况下都适用于您(因为它将匹配任何script开放标记,然后是任何不以.开头的序列或<script(请参阅<script)然后是您所需的值,然后是0 +字符,直到第一个</script),但请记住,正则表达式不是操作HTML的正确工具。当你的HTML被破坏时,只能用它作为后备。