PHP - 删除HTML字符串

时间:2015-11-18 14:10:36

标签: php html regex dom domdocument

我应该删除从通用网站URL的file_get_contents中提取的PHP字符串中的标记之间的所有内容(和标记)。
我正在使用RegEx表达式:


&#xA ;
  preg_replace('/< script \ b [^>] *>(。*?)< \ / script> / is',“”,$ string);
  




它工作正常,但我的问题是,如果脚本包含CDATA标记,它将无法正常工作。字符串的示例是:




 < script type ='text / javascript'>
 / *<![CDATA [* /
 var variable = {“ajax”:“.....”}
 / *]]> * /
< / script>
  




我猜问题是那些“/ ”和“ /“tags。








我已经在google和Stack Overflow上进行了搜索,但是他们没有问题与特定类型的cdata标签(使用/ *和* /),所以没有任何作用。


有任何建议吗?

&#xA; 编辑:< / strong>&#xA;正如Steve回答的那样,我现在正在使用这样的代码:

&#xA;&#xA;
  foreach($ dom-&gt; getElementsByTagName('script') )作为$ scripttag){&#xA; $ scripttag-&gt; parentNode-&gt; removeChild($ scripttag);&#xA;}&#xA;  
&#xA;&#xA;

然后我有:

&#xA;&#xA;
  foreach($ dom-&gt; getElementsByTagName('ins')as $ string){&#xA; $ string2。= $ string-&gt; nodeValue;&#xA; $ string2。='';&#xA;}&#xA;  
&#xA;&#xA;

但是返回带有脚本标签的$ string2。

&#xA;&#xA;

编辑2(求助):&#xA;在Steve的帮助下,我发现使用Xpath可以解决问题:

&#xA; &#xA;
  $ xpath = new DOMXpath($ dom);&#xA; foreach($ xpath-&gt; query('// script')as $ node){&#xA; $ node-&gt; parentNode-&gt; removeChild($ node);&#xA;}&#xA;  
&#xA;&#xA;

删除另一个内部的脚本标记标签,例如:

&#xA;&#xA;
 &lt; ins&gt;&lt; script&gt; First JS&lt; / script&gt;&lt; / ins&gt;&#xA;&lt; ins&gt;您好&lt; / ins&gt;&#xA;&lt; script&gt;第二个JS&lt; / script&gt;&#xA;  
&#xA;&#xA;

将输出

&# xA;&#xA;
  Hello&#xA;  
&#xA;&#xA;

谢谢大家的帮助!

&#xA;

1 个答案:

答案 0 :(得分:2)

不要使用正则表达式,使用正确的html解析器,如domdocument:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
//removing elements from a nodelist resets the internal pointer, so traverse backwards:
$elements = $dom->getElementsByTagName('script');
$count = $elements->length;
while(--$count){
    $elements->item($count)->parentNode->removeChild($elements->item($count));
}

//you can do further dom manipulation here if needed
$insertContents='';
foreach($dom->getElementsByTagName('ins') as $insert){
    $insertContents .= $insert->nodeValue . ' ';
}
//if you need the complete html at all:
$html = $dom->saveHTML();
//your desired string:
echo $insertContents;