PHP - 删除 <script> 内的所有内容和 HTML 字符串的 CDATA

PHP - Remove all content inside <script> and CDATA of HTML string

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

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

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

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

我想问题出在那些“/”和“/”标签上。


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

有什么建议吗?

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

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

然后我有:

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

但是 returns 一个带有脚本标签的 $string2。

编辑 2(已解决): 在 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

谢谢大家的帮助!

不要为此使用正则表达式,使用正确的 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;