查找文本文件中发生的最大字符串

时间:2012-04-21 14:08:59

标签: php html text flat-file

所以我之前看过的问题是找到文件中字符串的最大出现,但所有这些都依赖于知道要查找的内容。

我有一个你几乎可以称之为平面文件数据库的东西,该数据库抓取一堆输入数据,并且基本上用html span标签包含引用id的不同部分。

每一行都以这种方式出现:

<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中完成此操作?

2 个答案:

答案 0 :(得分:1)

查看DOMXPath,您可以使用XPath查询获取所有#text,然后使用php查找最常用的查询。 有一个问题是你几次使用相同的id,这是无效的HTML,所以DOM可能会破坏。

答案 1 :(得分:1)

首先关闭:您的格式不利于此类数据操作;你可能想考虑改变它。

据说,根据这种结构,合理的解决方案是利用DOMXPath,Dani说。这可能是有问题的,因为那里有所有重复的id,但在实践中它起作用(发出一大堆警告,这是数据结构提供修订的另一个原因) )。

以下是一些符合这个想法的代码:

$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.";

<强> See it in action

更新(在修复重复ID问题时看到):您只需将xpath查询更改为"//*[@class='text']/text()",以便继续匹配。然而,这种做事方式仍然效率低下,因此如果其中一项或多项适用:

  • 你将一直这样做
  • 你有很多数据
  • 你需要它真的很快

然后改变数据格式是一个好主意。