$html = new DOMDocument();
$html->loadHTMLFile($filename);
$meta = $html->getElementsByTagName("meta");
foreach($meta as $oldmeta_tags)
{
$parent = $oldmeta_tags->parentNode;
$parent->removeChild($oldmeta_tags);
}
echo "<br>Number of bytes stored = ".$html->saveHTMLFile($filename);
$result[] = file_get_contents($filename);
某些元标记已删除,而某些元标记则未删除。请帮助我做错了
答案 0 :(得分:4)
当您使用foreach
迭代DOMNodeList
并删除元素时,您正在更改DOMNodeList
内容,因此将跳过节点。你必须向后迭代:
$nodes = $dom->getElementsByTagName('meta');
for ($i = $nodes->length - 1; $i >= 0; $i--) {
$nodes->item($i)->parentNode->removeChild($nodes->item($i));
}
答案 1 :(得分:0)
您正在循环遍历数组并同时从中删除。
不幸的是,这意味着每次在循环中删除子节点时,下一个循环迭代都会跳过一个节点。与foreach
结合使用DOMDocument
不够“聪明”,以便智能地执行此操作。
而不是foreach
,使用索引:
$meta = $html->getElementsByTagName("meta");
for ($i = $meta->length - 1; $i >= 0; $i--) { // `foreach` breaks the `removeChild`
$child = $meta->item($i);
$child->parentNode->removeChild($child);
}