所以我之前看过的问题是找到文件中字符串的最大出现,但所有这些都依赖于知道要查找的内容。
我有一个你几乎可以称之为平面文件数据库的东西,该数据库抓取一堆输入数据,并且基本上用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中完成此操作?
答案 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()"
,以便继续匹配。然而,这种做事方式仍然效率低下,因此如果其中一项或多项适用:
然后改变数据格式是一个好主意。