是否可以在不创建新元素的情况下从已加载的DOM
中删除元素?例如:
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
foreach($dom->getElementsByTagName('a') as $href)
if($href->nodeValue == 'First')
//delete
答案 0 :(得分:85)
通过告知父节点删除子节点来删除节点:
$href->parentNode->removeChild($href);
请参阅DOMNode::$parentNode
Docs和DOMNode::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;