2013-03-07 82 views
26

是否有可能删除加载DOM元素,而无需创建一个新的?例如这样的事情:如何用DOMDocument删除元素?

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

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

的可能重复[PHP:无法删除的DomDocument节点(http://stackoverflow.com/questions/3602207/php-cant-remove-node-from-domdocument) – hakre 2013-03-07 13:42:46

回答

72

你告诉父节点删除子删除节点:

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

DOMNode::$parentNodeDocsDOMNode::removeChild()Docs

看得那么清楚:

+2

呵呵:)我们几乎在同一秒钟给了*相同的*答案。 – hek2mgl 2013-03-07 13:44:22

+2

是的,没有太多的选择如何做到这一点。我现在添加了一些链接,使其成为实际的答案,但这实际上是一个重复的候选人的气味。至少有一个人应该选择一些好的相关问题。 – hakre 2013-03-07 13:48:55

15

轻松:

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

(复制)完全一样,用户hakre ... – 2013-09-10 17:39:16

+2

@PeterKrauss我们回答在完全相同的时间,奇怪的是,我没有得到任何upvotes =/ – silkfire 2013-09-11 07:47:44

+1

是的,对不起(!)...现在我看到的时候。需要删除我的评论? – 2013-09-11 19:20:12

7

这花了我一段时间来弄清楚,所以这里的一些说明:

如果你在一个循环中删除从元素(如OP的例子),你需要循环向后

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

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