首页 文章

PHP - 删除HTML脚本中<script>和CDATA内的所有内容

提问于
浏览
2

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

preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $string);

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

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

我猜问题是那些“/ " and " /”标签 .


我已经在google和Stack Overflow上进行了搜索,但对于特定类型的cdata标签(使用/ /)来说,这是毫无疑问的,所以没有任何作用 .

有什么建议吗?

Edit: 正如史蒂夫回答的那样,我现在正在使用这样的代码:

foreach($dom->getElementsByTagName('script') as $scripttag){
$scripttag->parentNode->removeChild($scripttag);
}

然后我有:

foreach($dom->getElementsByTagName('ins') as $string) {
    $string2 .= $string->nodeValue;
    $string2 .= ' ';
}

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

EDIT 2 (SOLVED): 在Steve的帮助下,我发现使用Xpath解决了这个问题:

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

这也会删除另一个标记内的脚本标记,例如:

<ins><script>First JS</script></ins>
<ins>Hello</ins>
<script>Second JS</script>

会输出

Hello

谢谢大家的帮助!

1 回答

  • 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;
    

相关问题