0

そのため、以前に、ファイル内の文字列の最大出現回数を見つけるという質問を見てきましたが、それらはすべて、何を探すべきかを知っていることに依存しています。

入力データの束を取得し、基本的にそのさまざまな部分を id を参照する html スパン タグでラップするフラット ファイル データベースと呼ばれるものがあります。

各行は次のような形式で出てきます。

<p>
<span class="ip">58.106.**.***</span> 
Wrote <span class='text'>some text</span>
<span class='effect1'> and caused seizures </span>
<span class='time'>23:47</span> 
</p>

次に、最も多く発生する #test コンテンツを見つけるにはどうすればよいでしょうか。

つまり、もし私が持っていたら

<p>
    <span class="ip">58.106.**.***</span> 
    Wrote <span id='text'>woof</span>
    <span class='effect1'> and caused seizures </span>
    <span class='time'>23:47</span> 
    </p>

<p>
    <span class="ip">58.106.**.***</span> 
    Wrote <span class='text'>meow</span>
    <span class='effect1'> and caused mind-splosion </span>
    <span class='time'>23:47</span> 
    </p>

<p>
    <span class="ip">58.106.**.***</span> 
    Wrote <span class='text'>meow</span>
    <span class='effect1'> and used no effect </span>
    <span class='time'>23:47</span> 
    </p>

<p>
    <span class="ip">58.106.**.***</span> 
    Wrote <span class='text'>meow</span>
    <span class='effect1'> and used no effect </span>
    <span class='time'>23:47</span> 
    </p>

出力は「ニャー」になります。

これをphpでどのように達成しますか?

4

2 に答える 2

1

まず、あなたのフォーマットはこの種のデータ操作を助長しません。変更することを検討してください。

とはいえ、この構造に基づく論理的な解決策はDOMXPath、Dani が言うように活用することです。これは、そこにすべての重複があるために問題が発生する可能性がありidましたが、実際には機能します (大量の警告を発した後、これはデータ構造が改訂を可能にするもう 1 つの理由です)。

アイデアに沿ったコードを次に示します。

$input = '<body>'.get_input().'</body>';
$doc = new DOMDocument;
$doc->loadHTML($input); // lots of warnings, duplicate ids!
$xpath = new DOMXPath($doc);
$result = $xpath->query("//*[@id='text']/text()");

$occurrences = array();
foreach ($result as $item) {
    if (!isset($occurrences[$item->wholeText])) {
        $occurrences[$item->wholeText] = 0;
    }
    $occurrences[$item->wholeText]++;
}

// Sort the results and produce final answer    
arsort($occurrences);
reset($occurrences);

echo "The most common text is '".key($occurrences).
     "', which occurs ".current($occurrences)." times.";

実際に見てください

更新(重複したIDの問題を修正したので見てください):単にxpathクエリを変更し"//*[@class='text']/text()"て、引き続き一致するようにします。ただし、この方法は依然として非効率的であるため、これらの 1 つまたは複数に当てはまる場合は、次のようになります。

  • あなたはいつもこれをするつもりです
  • あなたはたくさんのデータを持っています
  • あなたは本当に速くする必要があります

その場合、データ形式を変更することをお勧めします。

于 2012-04-21T14:25:51.257 に答える
1

DOMXPathを見てください。XPathクエリを使用してすべてを取得し、#textphp で最もよく使用されるものを見つけることができます。
有効な HTML ではない同じ ID を数回使用したため、DOM が壊れる可能性があるという問題があります。

于 2012-04-21T14:13:56.177 に答える