我有以下脚本,可以在帖子中多次出现
<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 是否至少存在于脚本中一次。 请帮忙!
答案 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被破坏时,只能用它作为后备。