2012-04-21 88 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