PHP DOMDocument 没有删除所有元素

PHP DOMDocument not removing all element

我想删除所有 script 元素和这里的代码

<?php
$pageFile = <<<EOF
<!DOCTYPE html><html><body>
<script src="aa"></script>
<script src="bb"></script>
<script src="cc"></script>
<div>aaa</div>
</body></html>
EOF;

$dom = new DOMDocument();
$dom->loadHTML($pageFile);

foreach ($dom->getElementsByTagName('script') as $item) {
  $item->parentNode->removeChild($item);
}
$pageFile = $dom->saveHTML();
echo $pageFile;

但仍有 1 个 script 元素存在。你可以在线试一下here

结果:

<!DOCTYPE html>
<html><body>
<script src="bb"></script><div>aaa</div>
</body></html>

$dom->getElementsByTagName返回的DOMNodeList为"live"。因此,当您删除脚本时,它会从节点列表中删除,并且列表中的所有元素都会将其索引向下移动。然后 for 循环转到下一个索引,并最终跳过所有其他元素。

首先将节点列表转换为数组。

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

如果向后迭代,您可以修改甚至删除 DOMNodeList 中的节点: http://php.net/manual/en/class.domnodelist.php#83390 使用:

<?php
$pageFile = <<<EOF
<!DOCTYPE html><html><body>
<script src="aa"></script>
<script src="bb"></script>
<script src="cc"></script>
<div>aaa</div>
</body></html>
EOF;

$dom = new DOMDocument();
$dom->loadHTML($pageFile);
$elements = $dom->getElementsByTagName('script');
for ($i = $elements->length; --$i >= 0; ) {
  $elem = $elements->item($i);
  $elem->parentNode->removeChild($elem);
}
$pageFile = $dom->saveHTML();
echo $pageFile;