2011-03-10 453 views
1

這可能是v.easy,但我的php很生鏽。我需要實現一個壞詞過濾器......我現在有這樣的:檢查值是否在數組中

if(!in_array($_POST['Name'],$profanities)) { echo $row['Name']; } 

...並與它壞的話褻瀆陣列。問題是我想能夠檢查用戶輸入的名稱中是否有任何部分包含這些錯誤的單詞之一....我目前得到的只是檢查名稱是否是確切的錯誤單詞....如何我是否這樣做?

感謝

回答

1
$name = $_POST['Name']; 

foreach($profanities as $profanity) { 

    if (preg_match('/\w' . preg_quote($profanity, '/') . '\w/i', $name) { 
     // Bad word on its own 
    } 

} 

這將在只有自己的...即匹配一個壞詞,它將匹配badIs it bad?但不是在baddy。如果你想匹配,你可以刪除單詞界限,或者試試strstr()

但是,如果您決定檢查簡單字符串匹配,則有效名稱可能包含被認爲是錯誤的子字符串

如果我想在我的hometown之後命名我的用戶名,該怎麼辦?

1

此代碼將匹配通過搜索不區分大小寫的匹配找到的所有不良詞。

foreach($profanities as $profanity) 
{ 
    if(preg_match('/' . $profanity . '/i', $row['Name'])) 
    { 
     echo 'Bad word found!'; 
    } 
}
2

技術上有幾個選項,其他一些答案指出了這些。然而,實際上,我會說不要這樣做。

褻瀆過濾器是非常令人沮喪和限制用戶與異常或外國的名稱/地址/等。

請參閱:http://en.wikipedia.org/wiki/Swear_filter#Unintended_consequences

此外,如果你的用戶希望找到解決的過濾器的方式,他們會的。他們將使用類似的發音字符或特殊字符作爲替換和添加。

編輯:有一個優秀的計算器已經解決了這個問題。請參閱How do you implement a good profanity filter?

編輯:雖然上面的stackoverflow問題是指傑夫的這篇文章,它不能傷害重複和加強。 Obscenity Filters: Bad Idea, or Incredibly Intercoursing Bad Idea?

+1

好點,但它的範圍要求 – 2011-03-10 13:57:18

+0

這是非常不幸的。雖然可能值得讓老闆指出一些原因,而不是這樣做,但我認識到它並不總是一種選擇。鏈接的SO問題也要求php解決這個問題,還有一些可以找到的問題。我會建議一個簡單的preg_match/in_str。使用字邊界進行檢查將是優選的,例如,大規模會好起來,而屁股可能不會。不過,我會警告,這會令人沮喪。 $$,a $ s,a§§,@§§?這些要求是否也指定了這些詞的列表? – 2011-03-10 14:04:16