0

本当に、この質問に適切なタイトルがありません。私の研究からの奇妙な質問です。これは例です:

XML テキスト :

The <tag1>quick brown fox</tag1> <tag2>jumps over</tag2> the lazy <tag1>dog</tag1>

総単語数(タグ内のテキストを1単語としてカウント):6

私の質問が次の場合:

<tag1>本文中の位置は?答えは26

<tag2>本文中の位置は?答えは3

テキスト内の「怠け者」という言葉の位置は?答えは5です

誰にもアイデアはありますか?私はこれについて手がかりがありませんでした。

4

1 に答える 1

1

誰にもアイデアはありますか?私はこれについて手がかりがありませんでした。

たとえば、ドキュメント要素/ルート要素の一部として、XML テキストを XML としてXML パーサーにロードします。次に、その要素のすべての子ノードを反復処理して、次のように決定します。

  • 各要素ごとに、+1カウントします
  • 各テキストごとに、+ そのテキスト内の単語をカウントします (テキストの単語をカウントする方法については、他の Q&A 資料を参照してください)。

反復が完了すると、単語数が得られます。

コード例:

<?php
/**
 * Count Words on XML Text Using PHP
 * @link https://stackoverflow.com/a/17670772/367456
 */

$xmlText = <<<BUFFER
The <tag1>quick brown fox</tag1> <tag2>jumps over</tag2> 
  the lazy <tag1>dog</tag1>
BUFFER;

$doc    = new DOMDocument();
$result = $doc->loadXML(sprintf('<root>%s</root>', $xmlText));
if (!$result) {
    throw new Exception('Invalid XML text given.');
}

/**
 * replace this function with your own implementation that works
 * for all your UTF-8 strings, this is just a quick example mock.
 */
function utf8_count_words($string) {
    return (int)str_word_count($string);
}

$wordCount = 0;
foreach ($doc->documentElement->childNodes as $node) {
    switch ($node->nodeType) {
        case XML_ELEMENT_NODE:
            $wordCount++;
            break;
        case XML_TEXT_NODE:
            $wordCount += utf8_count_words($node->data);
            break;
        default:
            throw new Exception(
                sprintf('Unexpected nodeType in XML-text: %d', $node->nodeType)
            );
    }
}

printf("Result: %d words.\n", $wordCount);

出力例 ( Demo ):

Result: 6 words.
于 2013-07-16T07:42:17.627 に答える