1

这是我的代码:

我想获取 HTML 文档中文本节点的总数。

 // a new dom object
$dom = new domDocument;

// load the html into the object
$dom->loadHTMLFile('translated/test.html');

// discard white space
$dom->preserveWhiteSpace = false;

$i = 0;

// get elements by tagname body
while ($bodynodes = $dom->getElementsByTagName('body')->item($i)) {
    myFunc($bodynodes);
    $i++;
}

//var_dump($holder);

function myFunc($node) {
    static $i;
    if (!isset($i)) {
        $i = 0;
    }
    if ($node->childNodes) {
        foreach ($node->childNodes as $subNode):
            myFunc($subNode);
        endforeach;
    }else {

        if ($node->nodeType == 3 && trim($node->nodeValue) != ''):
            $i++;


        endif;
    }
    if ($node->lastChild):
        echo $i;
    endif;
}

但我得到的是

Result ====>  1233

因为我的 HTML 文档中只有 3 个文本段。

4

1 回答 1

0

我认为这应该可以得到总数:

$count = myFunc($dom->getElementsByTagName('body'));
echo "The document has $count text nodes\n";

function myFunc($node) {
    if ($node->childNodes) {
        $total = 0;
        foreach ($node->childNodes as $subNode):
            $total+= myFunc($subNode);
        endforeach;
        return $total;
    }
    else
    {
        if ($node->nodeType == 3 && trim($node->nodeValue) != '') {
            return 1;
        } else {
            return 0;
        }
    }
}

myFunc如果节点有子节点将这些子节点视为新树并返回总和的文本节点数,则调用它。否则它会根据节点类型及其值返回 1 或 0。

于 2012-12-21T11:48:00.300 回答