2

我想删除所有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;

但仍然script存在 1 个元素。你可以在这里在线尝试

结果:

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

2 回答 2

2

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

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

foreach (iterator_to_array($dom->getElementsByTagName('script')) as $item) {
  $item->parentNode->removeChild($item);
}
于 2019-03-17T10:34:13.733 回答
1

如果向后迭代,您可以修改甚至删除 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;
于 2019-03-17T10:35:56.350 回答