PHP - 如何使用DOMDocument删除HTML字符串的所有<script>和CDATA

时间:2017-05-03 17:32:13

标签: php dom domdocument

我应该删除&lt; script&gt; 中的所有内容和HTML字符串的CDATA。

&#xA;&#xA;

我正在使用这样的代码:

&#xA;&#xA;
  $ content =“&#xA; TEST1&#xA;&lt; script type ='text / javascript'&gt;&#xA; / *&lt; ![CDATA [* /&#xA; var markers = [{'ID':3681,'post_author':'4'}]&#xA; / *]]&gt; * /&#xA;&lt; / script&gt ;&#xA; TEST2&#xA;“;&#xA;&#xA; libxml_use_internal_errors(true);&#xA; $ domDoc = new DOMDocument();&#xA; $ domDoc-&gt; loadHTML($ content) ;&#xA; libxml_clear_errors();&#xA;&#xA; foreach($ domDoc-&gt; getElementsByTagName('script')as $ scripttag){&#xA; $ scripttag-&gt; parentNode-&gt; removeChild($ scripttag);&#xA;}&#xA;  
&#xA;&#xA;

但它不起作用。什么都没有删除。

&#xA;&#xA;

没关系,如果我正在使用这样的RegEx表达式

&#xA;&#xA;
  $ re ='/<script\b[^>]*>.*?<\/script>/is';
$str ='TEST1&#xA;&lt; script type = \'text / javascript \'&gt;&#xA; / *&lt;![CDATA [* /&#xA; var markers = [{\'ID \':3681,\'post_author \':\'4 \'}] &#xA; / *]]&gt; * /&#xA;&lt; / script&gt;&#xA; TEST2';&#xA;&#xA; $ content = preg_replace($ re,'',$ str,1);&#xA;  
&#xA;&#xA;

是否可以使用PHP DOMDocument 而非RegEx表达式删除此类内容?

&#xA; &#xA;

使用Hatef回答编辑

&#xA;&#xA;
  $ content =“&#xA;&lt; script type =' text / javascript'&gt;&#xA; / *&lt;![CDATA [* /&#xA; var _cf7 = {'recaptcha':{'messages':{'empty':'Merci de confirmer que vous n \ u2019 \ u00eates pas un robot。'}},'cached':'1'};&#xA; / *]]&gt; * /&#xA;&lt; / script&gt;&#xA;&lt; script type = 'text / javascript'src ='https://www.test.com/includes/js/scripts.js'>&lt; / script&gt;&#xA;&lt; script type ='text / javascript'&gt;& #xA; / *&lt;![CDATA [* /&#xA; var pollsL10n = {'ajax_url':'https:\ / \ / www.test.com \ /ajax.php','text_wait':'你的最后一个请求仍在处理中。请稍等...','text_valid':'请选择有效的民意调查答案。','text_multiple':'允许的最大选择数:','show_loading':'1' “show_fading ':'1'};&#xA; / *]]&gt; * /&#xA;&lt; / script&gt;&#xA;&lt;! -  [if lt IE 8]&gt;&#xA;&lt; script type ='text / javascript'src ='https:// www ..test.com / json2.min.js'&gt;&lt; / script&gt;&#xA;&lt;![endif]  - &gt;&lt; script type ='text / javascript'&gt;&#xA; / *&lt;![CDATA [* /&#xA; var ajaxurl ='https:\ / \ / .test.com \ /ajax.php';&#xA; / *]]&gt; * /&#xA;&lt; / script&gt;&#xA;&lt; script type ='text / javascript'src ='https://www.test.com/slider.min.js?x40297'&gt;&lt; /脚本&GT;&#XA;&LT;脚本&GT;&#XA; (函数(i,s,o,g,r,a,m){i ['GoogleAnalyticsObject'] = r; i [r] = i [r] || function(){&#xA;(i [r ] .q = i [r] .q || [])。push(arguments)},i [r] .l = 1 * new Date(); a = s.createElement(o),&#xA; m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a,m)&#xA;})(窗口,文档,'脚本','https ://www.google-analytics.com/analytics.js','ga');&#XA;&#XA; ga('create','UA-37273722-1','auto');&#xA; ga('send','pageview');&#xA;&lt; / script&gt;&#xA;“;&#xA;&#xA; libxml_use_internal_errors(true);&#xA; $ domDoc = new DOMDocument() ;&#xA; $ domDoc-&gt; loadHTML($ content);&#xA; libxml_clear_errors();&#xA;&#xA; foreach($ domDoc-&gt; getElementsByTagName('script')as $ scripttag){ &#xA; $ scripttag-&gt; parentNode-&gt; removeChild($ scripttag);&#xA;}&#xA; $ content = $ domDoc-&gt; saveHTML();&#xA;  
&#xA;&#xA;

$ content 包含

&#xA;&#xA;
 &lt;!DOCTYPE html PUBLIC“ -  / / W3C // DTD HTML 4.0 Transitional // EN“”http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><script type =“text / javascript”src =“https://www.test.com/includes/js/scripts.js”&gt;&lt; / script&gt;&lt;! -  [if lt IE 8]&gt;&# xA;&lt; script type ='text / javascript'src ='https://www..test.com/json2.min.js'>&lt; / script&gt;&#xA;&lt;![endif]  -  - &gt;&lt; script type =“text / javascript”&gt;&#xA; / *&lt;![CDATA [* /&#xA; var ajaxurl ='https:\ / \ /。test.com \ / ajax .php';&#xA; / *]]&gt; * /&#xA;&lt; / script&gt;&lt; sc RIPT&GT;&#XA; (函数(i,s,o,g,r,a,m){i ['GoogleAnalyticsObject'] = r; i [r] = i [r] || function(){&#xA;(i [r ] .q = i [r] .q || [])。push(arguments)},i [r] .l = 1 * new Date(); a = s.createElement(o),&#xA; m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a,m)&#xA;})(窗口,文档,'脚本','https ://www.google-analytics.com/analytics.js','ga');&#XA;&#XA; ga('create','UA-37273722-1','auto');&#xA; ga('send','pageview');&#xA;&lt; / script&gt;&lt; / head&gt;&lt; / html&gt;&#xA;  
&#xA;

1 个答案:

答案 0 :(得分:1)

您的DOMDocument解决方案完美无缺;你只是错过了实际保存HTML的最后一行:

$content = $domDoc->saveHTML();

正如您可能已经知道的那样,not to use regex to parse HTML会更好。

这个应该适用于你的新例子:

$scriptTags = $domDoc->getElementsByTagName('script');

while($scriptTags->length > 0){
    $scriptTag = $scriptTags->item(0);
    $scriptTag->parentNode->removeChild($scriptTag);
}