如何用DOMDocument删除元素?

时间:2013-03-07 13:41:23

标签: php domdocument

是否可以在不创建新元素的情况下从已加载的DOM中删除元素?例如:

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

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

5 个答案:

答案 0 :(得分:85)

通过告知父节点删除子节点来删除节点:

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

请参阅DOMNode::$parentNodeDocsDOMNode::removeChild()Docs

参见:

答案 1 :(得分:16)

轻松:

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

答案 2 :(得分:16)

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

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

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

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

答案 3 :(得分:1)

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

万一有人遇到我遇到的同样的问题。

在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();

答案 4 :(得分:0)

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

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;