您應該使用正確的工具(如DOMDocument
)解析HTML,而不是依賴正則表達式。
這裏是示出如何抓住內部含有字customfunction_div
的script
標籤和刪除它們的一個片段:
$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();
參見PHP demo
這裏,//script[contains(.,"customfunction_div")]
是抓住script
標籤XPath表達式其內容(.
)包含customfunction_div。
如果你堅持一個正則表達式,則'~<script\b(?:(?!</?script[\s>]).)*customfunction_div.*?</script>~s'
模式應該爲你在大多數情況下工作(因爲它會匹配任何<script
開放的標籤,那麼任何序列沒有開始<script
或</script
(見(?:(?!</?script[\s>]).)*
),然後你所需的值,然後0+字符到第一個</script>
),但請記住,正則表達式不是操作HTML的正確工具。只有當您損壞HTML時纔將其用作備用。
嘗試https://ideone.com/84eH8f,查看[正則表達式演示](https://regex101.com/r/dS1xR7/2) –