2014-01-05 150 views
0

嗨,請幫助我我使用此代碼來過濾一些單詞,但問題是它不匹配確切的單詞,而是它只是阻止包含我的單詞中的字母的單詞。創建壞詞過濾器

例如:「.com」我型指揮官和這個詞被封鎖了,請幫忙。

$badwords = explode('|', 'http|www|.com'); 
    foreach($badwords as $badword) 
    { 

     if(preg_match("/$badword/", $post->data['message'], $match)) 
     { 

      $post->errors['badwords']['error_code'] = "Warning message goes here"; 

     } 
    } 
+1

[字界線](http://www.regular-expressions.info/wordboundaries.html) –

+0

看看這個答案,這是我在過去使用http://stackoverflow.com/一個/ 15552300/1415724 –

回答

0

你想要的行可能

preg_match("/\b$badword\b/i", $post->data['message'], $match)) 

\b表示不能用於形成一個字(見here)的字母。這可以防止com匹配commanderdatacom。最後的i使搜索不區分大小寫。

另外,請記住,使用.com作爲您的一個壞字可能沒有您想要的效果。句點字符(.)匹配任意正則表達式中的單個字符。相反,你想要搜索(\.),這將實際上匹配的時期。 (有關週期字符的詳細信息,請參閱here)。

最後,如果您嘗試匹配網址,則可以查看this question

+0

你的正則表達式是正確的,但(如果我很厚,並糾正我)不會你的strpos函數選擇任何包含該短語的單詞?這可能會很棘手,如果山雀被添加到壞詞列表 - 那麼它會阻止泰坦,針等。 –

+0

相當正確,@GrahamRitchie - 謝謝! – Richard

+0

沒有probs甜心 - 正則表達式比我更好的解釋:-P –

0

對於單詞(我的意思的話不.COM等),這是簡單的

你只是想pregmatch

'/\b' . $badword . '\b/' 

\ b爲全站一個字邊界

你必須逃避他們。意思是他們的字面意思(沒有\他們實際上意味着和正則表達式中的字符),所以我要麼寫一個函數,尋找完全停止,然後在他們之前添加一個\或者直接將它們添加到已經附加的\列表中。