我有一个dom元素,里面有html。聊天包含一些我想删除的html元素,同时仍然保留一些可以使用的标签。
我尝试迭代子元素——所有子元素,并删除那些需要删除的
foreach ($node->getElementsByTagName('*') as $element)
if ($element->nodeName != 'br')
$node->removeChild($element);
但这会引发一个"未发现错误"异常,未被捕获会导致致命错误。我该如何解决这个问题?
使用以下命令删除节点:
$element->parentNode->removeChild($element);
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
是一个活动列表,所以我们不能在删除时向前迭代它。(尽管我们可以向后迭代。)