【问题标题】:trouble in removing the meta tag using php DOM api使用 php DOM api 删除元标记的麻烦
【发布时间】:2011-04-21 12:29:40
【问题描述】:
$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);

有些元标记被删除,有些则没有。请帮助我做错了什么

【问题讨论】:

  • (related) DOMNode replacement with PHP's DOM classes - 这是相同的答案,但由于这不像你的其他三个问题那样明显,我不会密切投票。看看,您几乎是从文档和示例中自己完成的 ;)

标签: php dom


【解决方案1】:

当您使用foreach 迭代DOMNodeList 并删除一个元素时,您正在更改DOMNodeList 的内容,因此将跳过节点。您必须向后迭代:

$nodes = $dom->getElementsByTagName('meta');
for ($i = $nodes->length - 1; $i >= 0; $i--) {
    $nodes->item($i)->parentNode->removeChild($nodes->item($i));
}

【讨论】:

    【解决方案2】:

    您正在循环遍历数组并同时从中删除。

    不幸的是,这意味着每次在循环中删除一个子节点时,下一次循环迭代都会跳过一个节点。 foreachDOMDocument 结合起来不够“聪明”,无法智能地做到这一点。

    使用索引而不是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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2012-10-07
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多