0

我在聊天中有一个带有 html 的 dom 元素,其中包含一些我想删除的 html 元素,同时仍然保留一些可以的标签。

我尝试遍历子元素所有子元素并删除那些需要删除的元素

foreach ($node->getElementsByTagName('*') as $element)
    if ($element->nodeName != 'br')
        $node->removeChild($element);

但这会引发 Not Found Error 异常,该异常未被捕获会导致致命错误。我将如何解决这个问题?

4

2 回答 2

2

请改用以下内容删除节点:

$element->parentNode->removeChild($element);
于 2012-01-22T03:22:24.333 回答
2

getElementsByTagName('*')查找所有后代元素,而不是元素。因此,$element您要删除的一些不是 的子级$node,因此失败。

我不能 100% 确定您的意图是什么,但很可能您只是想删除某些直系子女。在这种情况下,请执行以下操作:

$nodestoremove = array();
foreach ($node->childNodes as $n) {
    if ($n->nodeType===XML_ELEMENT_NODE and $n->nodeName!=='br') {
        $nodestoremove[] = $n;
    }
}
foreach ($nodestoremove as $n) {
    $node->removeChild($n);
}
unset($nodestoremove); // so nodes can be garbage-collected

echo $node->C14N(); // xml fragment after removal

请注意,我们进行了两次遍历:一次识别要删除的节点,第二次遍历删除。这是因为childNodes它是一个活动列表,所以我们不能在删除时向前遍历它。(尽管我们可以向后迭代它。)

于 2012-01-22T03:35:03.763 回答