行走的DOM崩溃了

时间:2012-09-08 22:31:49

标签: php dom

我有这个简单的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主体的直接后代。

这两个函数也没有错误。

0 个答案:

没有答案