1

这可能很容易,但我的 php 很生锈。我需要实现一个坏词过滤器......我目前有这个:

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

......还有一个包含脏话的脏话数组。问题是我希望能够检查用户输入的名称的任何部分是否包含这些坏词之一....我目前只检查名称是否是确切的坏词....如何我这样做吗?

谢谢

4

3 回答 3

2

从技术上讲,有一些选择,其他一些答案指出了这些。然而,实际上,我会说不要这样做。

脏话过滤器对于具有不寻常或外国名称/地址/等的用户来说是出了名的令人沮丧和限制。

请参阅:http ://en.wikipedia.org/wiki/Swear_filter#Unintended_consequences

此外,如果您的用户想找到绕过过滤器的方法,他们会的。他们将使用相似的发音字符或特殊字符作为替换和添加。

编辑:有一个很好的stackoverflow问题已经解决了这个问题。请参阅如何实现良好的亵渎过滤器?

编辑:虽然上面的 stackoverflow 问题是指 Jeff 的帖子,但重复和强化也无妨。淫秽过滤器:坏主意,还是令人难以置信的相互交流的坏主意?

于 2011-03-10T13:47:35.787 回答
1
$name = $_POST['Name'];

foreach($profanities as $profanity) {

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

}

这将仅匹配一个坏词本身......即它将匹配badinIs it bad?但不匹配 in baddy。如果您想匹配它,您可以删除单词边界,或者尝试strstr().

但是,如果您决定检查简单字符串匹配,则有效名称可能包含被认为是错误的子字符串。

如果我想以我的家乡命名我的用户名怎么办?

于 2011-03-10T13:44:20.917 回答
1

此代码将匹配通过搜索不区分大小写的匹配找到的所有坏词。

foreach($profanities as $profanity)
{
    if(preg_match('/' . $profanity . '/i', $row['Name']))
    {
        echo 'Bad word found!';
    }
}
于 2011-03-10T13:45:27.140 回答