2009-10-20 24 views
1

基本上,我有一個關鍵字數組和一段文本。我想知道,考慮到性能問題,找出這些關鍵字是否存在於文本中是最好的方法。PHP - 查找數組中是否存在任何一個關鍵字

我正在考慮循環訪問數組,併爲每個關鍵字執行strpos(),但數組中有好幾萬個單詞,需要PHP花一點時間才能完成,所以我想知道如果有更有效的方法來做到這一點。

+0

你能否提供一個字符串和數組的例子? – 2009-10-20 19:21:47

回答

2

取決於字符串的大小您可以使用散列使其更快。

首先迭代文本。對於每一個字,將其分配到一個數組:

foreach (preg_split("/\s/", $text) as $word) 
{ 
    $string[$word] = 1; 
} 

然後重複的關鍵字檢查$字符串:

foreach ($keywords as $keyword) 
{ 
    if (isset($string[$keyword])) 
    { 
     // $keyword exists in string 
    } 
} 

編輯 如果你的文字是比你的關鍵字小得多,做向後,檢查文本中每個單詞的關鍵字。如果文本非常短,這將比上述更快。

foreach (preg_split("/\s/", $text) as $word) 
{ 
    if (isset($keywords[$word])) 
    { 
     //might be faster if sizeof($text) < sizeof($keywords) 
    } 
} 
+0

我發現了一個更好的方法來回答您的問題。將文本字符串分解爲單獨的單詞,然後對每個單詞查看它是否在數組中。使用in_array而不是strpos。我想知道這是否會更快。謝謝你,拜倫。 :) – 2009-10-20 19:36:28

+0

嘿,我想我們都在這裏同時有AHAH時刻;)祝您好運 – 2009-10-20 19:38:02

+1

除了,如果您搜索每個單詞,in_array會變得很慢。你真正想要的是二進制搜索。 – 2009-10-20 19:38:53

0

我真的不知道,如果它是更有效的,但你可以嘗試把他們都在這樣的正則表達式: (關鍵字1 |關鍵字2 | ...) 隨着preg_quote功能,您可以逃脫的關鍵字爲正則表達式。如果您設置了編譯選項,將它與多個字符串一起使用可能會更有效。

+0

10,000個關鍵字會導致正則表達式分析器在整個地方都會出現漏洞。 – 2009-10-20 19:34:01

1

假設格式,只有你關心,如果任何(不是其中)存在的關鍵字,你可以嘗試這樣的:

$keywords = array("dog", "cat"); 

// get a valid regex 
$test = "(\b".implode("\b)|(\b", $keywords)."\b)"; 

if(preg_match($test, "there is a dog chasing a cat down the road")) 
    print "keyword hit"; 
+0

沒有。超過10,000個關鍵字。 – 2009-10-20 19:39:21

+0

你說得對。但是這個問題在當時沒有造成這樣的大小;) – 2009-10-20 19:43:44

+0

是的。(查看修訂歷史記錄) – 2009-10-20 20:58:44

0

,你可以放棄文本到一個數組中,並做了兩個陣列上的array_intersect_key。我不知道這雖然表現的......

1

工作過eWolf的想法...

foreach($keywords as &$keyword) { 
    $keyword = preg_quote($keyword); 
} 

$regex = "/(". implode('|', $keywords) .")/"; 

return preg_match($regex, $str); 

您不必檢查邊界,如果你不想要,但如果你只是用\ b包圍組(()個字符),然後它將只匹配給定的單詞。爲了安全起見,你需要確保所有數組的成員都是preg_quoted。

+1

超過10,000個關鍵字!!!!! – 2009-10-20 19:41:16

相關問題