这可能是v.easy但我的php非常生疏。我需要实现一个糟糕的单词过滤器...我目前有这个:
if(!in_array($_POST['Name'],$profanities)) { echo $row['Name']; }
......还有一个带有坏词的亵渎阵列。问题是我希望能够检查用户输入的名称的任何部分是否包含其中一个坏词......我目前只检查名称是否是确切的坏词....我这样做吗?
谢谢
答案 0 :(得分:2)
从技术上讲,有几个选项,其他一些答案指出了这些。但实际上,我会说不要这样做。
亵渎过滤器对于具有异常或外国名称/地址/等的用户来说是非常令人沮丧和限制的。
请参阅:http://en.wikipedia.org/wiki/Swear_filter#Unintended_consequences
此外,如果您的用户想要找到绕过过滤器的方法,他们会。他们将使用类似的发音字符或特殊字符作为替换和添加。
编辑:有一个很好的stackoverflow问题已经解决了这个问题。请参阅How do you implement a good profanity filter?
编辑:虽然上面的stackoverflow问题引用了杰夫关于此的帖子,重复和强化也不会有害。 Obscenity Filters: Bad Idea, or Incredibly Intercoursing Bad Idea?
答案 1 :(得分:1)
$name = $_POST['Name'];
foreach($profanities as $profanity) {
if (preg_match('/\w' . preg_quote($profanity, '/') . '\w/i', $name) {
// Bad word on its own
}
}
这将仅匹配一个坏词...即它将匹配bad
中的Is it bad?
但不会匹配baddy
中的strstr()
。如果您想匹配单词边界,可以删除单词边界,或者尝试{{1}}。
但是,如果您决定检查简单字符串匹配,则有效名称可能包含被视为 bad 的子字符串。
如果我想在hometown之后命名我的用户名怎么办?
答案 2 :(得分:1)
此代码将匹配通过搜索不区分大小写的匹配找到的所有不良单词。
foreach($profanities as $profanity)
{
if(preg_match('/' . $profanity . '/i', $row['Name']))
{
echo 'Bad word found!';
}
}