2009-12-07 48 views
2

只需要查看段落是否包含「停用詞」,停用詞在下面的數組中。另一個棘手的preg_match

我有公式爲:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan"); 

    foreach ($pattern_array as $pattern) { 
     if (preg_match('/'.$pattern.')/i', $paragraph)) { 
     $stopwords = 1; 
     } 
    } 

其中一期工程不夠好,但對於像像「panko」被確定爲停用詞「泛」字短詞。

所以正則表達式就像它必須在它之前有一個空格,或者是一個新行的開始,並以句號/空格/逗號/(其他非字符對象)結尾。

另外我怎麼能告訴PHP退出循環,一旦停止詞被識別?

謝謝你們,放慢我的學習正則表達式!

+1

至於停止循環,當你發現一個比賽,看看php.net/break – 2009-12-07 18:02:21

回答

4

使用\b(preheat|minutes|stir|heat|put|bowl|pan)\b作爲您的正則表達式。這樣,你只需要一個正則表達式(不需要循環),並通過使用字邊界斷言,確保只有整個單詞匹配。

+0

好吧我使用了這種方法(所有在一個正則表達式\ b),如果正則表達式中的項目數量過大,我會被告知性能問題。多少項目會太多? – bluedaniel 2009-12-07 18:14:30

+0

很難說。如果你想匹配單詞邊界,並且循環遍歷大量的正則表達式可能比擁有一個大的正則表達式要慢一些,我想你會被困在正則表達式中。你可以做一些優化,如'\ b(p(?:reheat | ut | an)| st(?:ir | ove)| etc。)\ b',這樣正則表達式引擎可以在找到第一個字符不匹配,但最好在不必要的優化之前先嚐試一下。 – 2009-12-07 18:33:48

+0

嗯,這是一個有趣的方法,它絕對是一個應用程序按預期工作,然後優化小部分東西的情況。我稍後再試一次,爲你的後續行動接受你的答案。歡呼蒂姆。 – bluedaniel 2009-12-07 18:43:11

2

還沒有試過這個,但\b應該是你要找的字符組。從PHP manual

\b word boundary 

你的代碼,然後將是這個樣子:

$pattern_array = array("preheat", "minutes", "stir", "heat", "put", "beat", "bowl", "pan"); 

foreach ($pattern_array as $pattern) { 
    if (preg_match('/\b'.$pattern.'\b/i', $paragraph)) { // also removed the ')' 
    $stopwords = 1; 
    break; // to exit the loop 
    } 
} 

編輯:看來人最好使用\ B,所以改變了這個相應

+0

它在主題字符串的末尾不匹配。 – SilentGhost 2009-12-07 18:08:49

+0

或開始的那個 – SilentGhost 2009-12-07 18:09:20

+0

改變了代碼使用'\ b',感謝您的評論:-) – 2009-12-07 18:09:51

2

你需要添加\b(代表字邊界)到你的正則表達式這樣:

'/\b'.$pattern.'\b/i' 

您的代碼似乎有拼寫錯誤,因爲您有一個文字右括號(並且不匹配部分文字),或者您有一個打開的右括號。

+0

是的抱歉,這是從前代碼測試typolo – bluedaniel 2009-12-07 18:11:42

2

1.您可以使用「\ b」來檢查單詞邊界。單詞邊界被定義爲單詞字符和非單詞字符之間的邊界。單詞字符是字母,數字和下劃線。

2.可以一氣呵成做這一切,通過使用「|」:

$stopwords = preg_match('/\\b(preheat|minutes|stir|heat|..other words..|pan)\\b/i', $paragraph) 
+0

好吧,我使用了這種方法(所有在一個正則表達式不是\ b),並且如果正則表達式中的項目數量變得太大,我會被警告性能問題。多少項目會太多? – bluedaniel 2009-12-07 18:31:41