使用php DOM api删除元标记时出现问题

时间:2011-04-21 12:29:40

标签: php dom

$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);

某些元标记已删除,而某些元标记则未删除。请帮助我做错了

2 个答案:

答案 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);
}