何度か使用したこの単純な DOM ウォーキング関数があります。
これは簡略化されたバージョンです:
function walk_DOM(&$dom, &$node, $func){
$args = array(&$node, &$dom);
call_user_func_array($func, $args);
if ($node->nextSibling !== null) {
walk_DOM($dom, $node->nextSibling, $func);
}
if ($node->hasChildNodes()) {
$children = nodeList_to_array($node->childNodes);
walk_DOM($dom, $children[0], $func);
}
}
私はその価値に疑問を持ち始めています。最近、$func 引数として新しい関数を使用しました。「#text」ノードと「p」ノードのみをレンダリングできるようにすることを目的としていました。
その機能は次のとおりです。
function strip_test(&$node, &$dom){
if (($node->nodeName !== 'p') &&
($node->nodeName !== '#text') &&
($node->nodeName !== 'body')) {
if ($node->parentNode !== null) {
$parent = $node->parentNode;
$parent->removeChild($node);
}
}
}
Walk_DOM() は、すべてのノードを表示せずに停止します。残っているノードは DOM にまだ存在します。それらは決して評価されませんでした。
では、質問に移ります。この手法に明らかに問題がありますか? そうでない場合、DOM の問題をデバッグする良い方法はありますか?
walk_DOM() がアクセスするノードを追跡したところ、カバーする部分と前に停止する部分に違いはありませんでした。
以前の使用で、私はそれを発見しました。シンプルですが、ノードを二重に検査することはなく、以前は DOM 全体をカバーしていました。
編集 :
明確にするために、「表示せずに停止する」と言うとき、(任意の) 50 個のノードのリストで、0 から 3 層の子を持つことを意味します。この関数は、それらの約 25% を解析してから停止します。解析する最後のノードは、DOM 本体の直接の子孫です。
どちらの関数もエラーをスローしません。