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

4

2 回答 2

1

看看DOMXPath,您可以使用 XPath 查询来获取所有内容#text,然后使用 php 找到最常用的一个。
有一个问题是您多次使用相同的 id,这不是有效的 HTML,因此 DOM 可能会中断。

于 2012-04-21T14:13:56.177 回答
1

首先:您的格式不利于这种类型的数据操作;您可能要考虑更改它。

也就是说,基于这种结构,合乎逻辑的解决方案是DOMXPath像 Dani 所说的那样利用。这可能是有问题的,因为id那里有所有重复的 s,但实际上它可以工作(在发出大量警告之后,这是数据结构提供修订的另一个原因)。

下面是一些与这个想法相关的代码:

$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()"使其继续匹配。然而,这种做事方式仍然效率低下,所以如果其中一个或多个适用:

  • 你会一直这样做
  • 你有很多数据
  • 你需要它非常快

那么更改数据格式是个好主意。

于 2012-04-21T14:25:51.257 回答