基本上,我有一個關鍵字數組和一段文本。我想知道,考慮到性能問題,找出這些關鍵字是否存在於文本中是最好的方法。PHP - 查找數組中是否存在任何一個關鍵字
我正在考慮循環訪問數組,併爲每個關鍵字執行strpos(),但數組中有好幾萬個單詞,需要PHP花一點時間才能完成,所以我想知道如果有更有效的方法來做到這一點。
基本上,我有一個關鍵字數組和一段文本。我想知道,考慮到性能問題,找出這些關鍵字是否存在於文本中是最好的方法。PHP - 查找數組中是否存在任何一個關鍵字
我正在考慮循環訪問數組,併爲每個關鍵字執行strpos(),但數組中有好幾萬個單詞,需要PHP花一點時間才能完成,所以我想知道如果有更有效的方法來做到這一點。
取決於字符串的大小您可以使用散列使其更快。
首先迭代文本。對於每一個字,將其分配到一個數組:
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)
}
}
我發現了一個更好的方法來回答您的問題。將文本字符串分解爲單獨的單詞,然後對每個單詞查看它是否在數組中。使用in_array而不是strpos。我想知道這是否會更快。謝謝你,拜倫。 :) – 2009-10-20 19:36:28
嘿,我想我們都在這裏同時有AHAH時刻;)祝您好運 – 2009-10-20 19:38:02
除了,如果您搜索每個單詞,in_array會變得很慢。你真正想要的是二進制搜索。 – 2009-10-20 19:38:53
我真的不知道,如果它是更有效的,但你可以嘗試把他們都在這樣的正則表達式: (關鍵字1 |關鍵字2 | ...) 隨着preg_quote功能,您可以逃脫的關鍵字爲正則表達式。如果您設置了編譯選項,將它與多個字符串一起使用可能會更有效。
10,000個關鍵字會導致正則表達式分析器在整個地方都會出現漏洞。 – 2009-10-20 19:34:01
假設格式,只有你關心,如果任何(不是其中)存在的關鍵字,你可以嘗試這樣的:
$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";
沒有。超過10,000個關鍵字。 – 2009-10-20 19:39:21
你說得對。但是這個問題在當時沒有造成這樣的大小;) – 2009-10-20 19:43:44
是的。(查看修訂歷史記錄) – 2009-10-20 20:58:44
,你可以放棄文本到一個數組中,並做了兩個陣列上的array_intersect_key。我不知道這雖然表現的......
工作過eWolf的想法...
foreach($keywords as &$keyword) {
$keyword = preg_quote($keyword);
}
$regex = "/(". implode('|', $keywords) .")/";
return preg_match($regex, $str);
您不必檢查邊界,如果你不想要,但如果你只是用\ b包圍組(()
個字符),然後它將只匹配給定的單詞。爲了安全起見,你需要確保所有數組的成員都是preg_quoted。
超過10,000個關鍵字!!!!! – 2009-10-20 19:41:16
你能否提供一個字符串和數組的例子? – 2009-10-20 19:21:47