DOM
是否可以在不创建新元素的情况下从加载中删除元素?例如这样的:
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
foreach($dom->getElementsByTagName('a') as $href)
if($href->nodeValue == 'First')
//delete
DOM
是否可以在不创建新元素的情况下从加载中删除元素?例如这样的:
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
foreach($dom->getElementsByTagName('a') as $href)
if($href->nodeValue == 'First')
//delete
通过告诉父节点删除子节点来删除节点:
$href->parentNode->removeChild($href);
请参阅DOMNode::$parentNode
文档和DOMNode::removeChild()
文档。
另见:
这花了我一段时间才弄清楚,所以这里有一些澄清:
如果要从循环中删除元素(如 OP 的示例中所示),则需要向后循环
$elements = $completePage->getElementsByTagName('a');
for ($i = $elements->length; --$i >= 0; ) {
$href = $elements->item($i);
$href->parentNode->removeChild($href);
}
DOMNodeList 文档:如果向后迭代,您可以修改甚至删除 DOMNodeList 中的节点
容易地:
$href->parentNode->removeChild($href);
我知道这已经得到了回答,但我想补充一下。
万一有人遇到我遇到的同样问题。
循环遍历 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();
用于删除标签或其他东西。
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;