2016-09-23 130 views
0

我有以下腳本,它可以有多次出現在後刪除使用正則表達式

<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

嘗試https://ideone.com/84eH8f,查看[正則表達式演示](https://regex101.com/r/dS1xR7/2) –

回答

0

您應該使用正確的工具(如DOMDocument)解析HTML,而不是依賴正則表達式。

這裏是示出如何抓住內部含有字customfunction_divscript標籤和刪除它們的一個片段:

$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時纔將其用作備用。