2010-11-16 185 views
0

我有一個包含大約450個單詞的「壞」單詞列表。將單詞列表與句子匹配

我試圖檢查判爲它

<?php 
$sentence = "A quick brown fox jumps over the lazy dog"; 
foreach($words as $word) { 
    $check = strstr($sentence,$word); 
    if(!empty($check)) 
     return false;   
} 
return true; 
?> 

是否有更快,更好的辦法呢?

回答

2

你可以嘗試使用preg_splitarray_intersect

<?php 
$sentence = "A quick brown fox jumps over the lazy dog"; 
$sntce_wrds = preg_split('/\s+/', $sentence); 
return count(array_intersect($sntnce_words, $words)) > 0; 
+0

即使在一行中有製表符或多個空格,'preg_split'方法的優點是可以工作。 – 2010-11-16 05:41:36

0

我覺得應該preg_replace滿足您的需求也是如此。傳遞$ words數組作爲替換的模式和空間。然後將結果與原始字符串進行匹配。例如

$newStr = preg_replace($words, '', $sentence); 

if($newStr !== $sentence) 
    return false; 

return true; 

讓我們知道這是否有幫助。

編輯:正如仍然指出的那樣,$ words數組中的單詞需要是有效的正則表達式。所以這個方法只有在單詞變成「one」到「/ one /」這樣的模式時纔有效。

編輯-2:如果您想爲某些原因保留字排列,然後用

$wordArr = preg_replace("/(.*)/", '/\1', $words); 

所有單詞轉換爲有效的正則表達式。我認爲,即使有這種開銷,它應該比長列表上的strstr更快。

+2

另外,請注意strstr比strpos要慢http://net-beta.net/ubench/index.php?t=strpos1。不知道正則表達式的速度如何,但由於它是一次性的,我認爲它會更快。 – pinaki 2010-11-16 06:02:04

+2

'$ words'數組中的每個元素都必須是有效的正則表達式。如果'$ words'被髮送到'preg_replace',單獨分割將不起作用。 – stillstanding 2010-11-16 06:05:34

+0

@stillstanding - 謝謝指點..編輯答案標記此.. – pinaki 2010-11-16 06:19:20