2012-04-21 87 views
0

因此,我在前面看到的问题都是在文件中查找字符串的最大出现次数,但所有这些都依赖于知道要查找的内容。查找文本文件中出现的最大字符串

我有什么几乎可以称之为平面文件数据库,它抓住一堆输入数据,并基本上将它的不同部分用引用id包裹在html span标记中。

每一行出来,在这种时尚:

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

回答

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()",以便它继续匹配。但是做事情的这种方式仍然是低效的,因此,如果一个或更多的这些应用:

  • 你要做到这一切
  • 你有大量的数据的时间
  • 你需要它是真的快速

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

+0

是的,我解决了问题的ID(需要睡更多哈哈),这是惊人的,谢谢吨,我没有加载输入到页面,虽然我在我呢?我能不能简单地用file_get_contents($ filename)来引用文本文件? – 2012-04-21 14:32:25

+0

我并不需要它真的很快,但它肯定会是一个奖金,而其他两个也适用:S,但我想保留在HTML /文本格式,并能够引用个别元素。 – 2012-04-21 14:34:10

+0

@MagicDev:是的第一个评论。第二,这一切都取决于你的要求是什么。如果没有所有的背景,我不能说。 – Jon 2012-04-21 14:43:37

1

看看DOMXPath,你可以使用XPath查询来获得所有的#text,然后找到最常用的一个用php。
存在一个问题,即您使用了几次相同的id,这是无效的HTML,因此DOM可能会中断。

+0

修复了ID的c: – 2012-04-21 14:21:28