【问题标题】:How to delete element with DOMDocument?如何使用 DOMDocument 删除元素?
【发布时间】:2013-02-22 17:48:30
【问题描述】:

是否可以从加载的DOM 中删除元素而不创建新元素?例如这样的:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);

foreach($dom->getElementsByTagName('a') as $href)
    if($href->nodeValue == 'First')
        //delete

【问题讨论】:

标签: php domdocument


【解决方案1】:

您通过告诉父节点删除子节点来删除节点:

$href->parentNode->removeChild($href);

参见DOMNode::$parentNodeDocsDOMNode::removeChild()Docs

参见:

【讨论】:

  • 是的,没有太多选项可以做到这一点。我现在添加了一些链接以使其成为实际答案,但这实际上闻起来像重复的候选人。至少应该选择一些好的相关问题。
【解决方案2】:

这花了我一段时间才弄清楚,所以这里有一些澄清:

如果您要从循环中删除元素(如在 OP 的示例中),您需要向后循环

$elements = $completePage->getElementsByTagName('a');
for ($i = $elements->length; --$i >= 0; ) {
  $href = $elements->item($i);
  $href->parentNode->removeChild($href);
}

DOMNodeList documentation: 如果向后迭代,您可以修改甚至删除 DOMNodeList 中的节点

【讨论】:

  • 你为我省了很多麻烦。谢谢!
【解决方案3】:

轻松:

$href->parentNode->removeChild($href);

【讨论】:

    【解决方案4】:

    我知道这已经被回答了,但我想补充一下。

    如果有人遇到我遇到的同样问题。

    循环遍历 domnode 列表并直接删除项目可能会导致问题。

    我刚刚阅读了这篇文章,并据此在我自己的代码库中创建了一个有效的方法:https://www.php.net/manual/en/domnode.removechild.php

    我会这样做:

    $links = $dom->getElementsByTagName('a');
    $links_to_remove = [];
    
    foreach($links as $link){
        $links_to_remove[] = $link;
    }
    
    foreach($links_to_remove as $link){
        $link->parentNode->removeChild($link);
    }
    
    $dom->saveHTML();
    

    【讨论】:

      【解决方案5】:

      用于删除标签或其他东西。

      removeChild($element->id());
      

      完整示例:

      $dom = new Dom;
      $dom->loadFromUrl('URL');
      $html = $dom->find('main')[0];
      $html2 = $html->find('p')[0];
      $span = $html2->find('span')[0];
      
      
      $html2->removeChild($span->id());
      
      echo $html2;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        相关资源
        最近更新 更多