我有这个简单的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主体的直接后代。
这两个函数也没有错误。