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