0

チャット内に html を含む dom 要素があり、削除したい html 要素がいくつか含まれていますが、いくつかのタグは問題ありません。

すべての子要素を繰り返し処理し、削除する必要があるものを削除しようとしています

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

ただし、これは Not Found Error 例外をスローし、キャッチされないと致命的なエラーが発生します。どうすればこの問題を解決できますか?

4

2 に答える 2

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

2つのパスを作成することに注意してください。1つは削除するノードを識別するためのもので、もう1つは削除するためのパスです。これは、childNodesがアクティブリストであるため、削除するときにリストを順方向に繰り返すことができないためです。(ただし、逆方向に繰り返すことはできます。)

于 2012-01-22T03:35:03.763 に答える
2

ノードを削除するには、代わりに次を使用します。

$element->parentNode->removeChild($element);
于 2012-01-22T03:22:24.333 に答える