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 に答える