2013-05-07 102 views
0

我試圖掃描一個字符串來檢查黑名單中的單詞。我使用preg_quote來處理特殊字符,例如星號,但它似乎不適用於美元符號。PHP preg_match和preg_quote不匹配美元符號

下面是測試我一直在運行:

$string_to_check = 'wordcontaining$'; 
$naughty_words = array('wordcontaining$', 'a*differentstring'); 
if(isset($naughty_words)){ 
    foreach($naughty_words as $word){ 
     if (preg_match('/\b'.preg_quote($word).'\b/i',$string_to_check)) { 
      var_export(array('found'=> true, 'word'=>$word)); 
     } 
    } 
} 

,我會希望返回

array (
    'found' => true, 
    'word' => 'wordcontaining$', 
) 

但不幸的是事實並非如此。如果我設置了$string_to_check = 'a*differentstring',那麼一切都按預期工作。

我在這裏錯過了非常明顯的東西嗎?

+0

什麼'\ b'在你的正則表達式中做什麼? – Rikesh 2013-05-07 16:12:25

+0

如果我沒有記錯(自從我編碼以來已經有一段時間了),它只會查找完整的單詞,即如果列入黑名單的單詞出現在較長單詞的中間,則不匹配。 – Josh 2013-05-07 16:15:14

+0

\ b是一個零寬度的字邊界(我相信它相當於'($ | \ W | ^)')。你能否嘗試導出preg_quote的結果來查看它是否正確擺脫了美元符號? – Adrian 2013-05-07 16:17:44

回答

1

\ B A \之間瓦特(字)和\ W(非字)

\ w是與[A-ZA-Z0-9_一個位置相匹配]因此$和空間都是非字,所以如果「naughty_word」開始或結束與符號表達式無法比擬

,你必須使用類似

preg_match('/\s*+'.preg_quote($word).'\s*+/i',$string_to_check) 
1

因此,根據我上面的評論,您需要從正則表達式中刪除第二個額外的\b

DEMO.

+0

不幸的是,根據上面的評論,這也會使'wordcontaining $ aaa'是一個無意的有效單詞。 – Josh 2013-05-08 08:16:00