46

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

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

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

5 回答 5

111

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

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

请参阅DOMNode::$parentNode文档DOMNode::removeChild()文档

另见:

于 2013-03-07T13:43:10.373 回答
33

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

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

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

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

于 2015-12-02T07:43:06.050 回答
17

容易地:

$href->parentNode->removeChild($href);
于 2013-03-07T13:43:18.473 回答
3

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

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

循环遍历 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();
于 2020-02-20T15:43:11.990 回答
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;
于 2021-01-12T06:15:20.773 回答