这是反垃圾邮件的有效编码吗?

时间:2009-09-21 02:34:15

标签: php

if(strpos($string, "A Bad Word") != false){
    echo 'This word is not allowed';
}
if(strpos($string, "A Bad Word") != false){
    echo 'This word is not allowed';
}

好的,我正在尝试检查提交数据,看看是否有不恰当的字词。而不是制作5个实例,是否有更有效的方法?

7 个答案:

答案 0 :(得分:6)

我确信通常有一种更聪明的方法可以做到这一点。

如果你只是想更简洁,那么最好循环一些不好的词,而不是添加重复的,几乎相同的条件句(ifs):

<?PHP
$banned = array('bad','words','like','these');

$looksLikeSpam = false;
foreach($banned as $naughty){
    if (strpos($string,$naugty) !== false){
        $looksLikeSpam=true;
    }
}

if ($looksLikeSpam){
   echo "You're GROSS!  Just... ew!";
   die();
}

编辑:另外,请注意,在您的问题代码中,您测试strpos!= false。你真的想要!==,因为如果第一个单词,strpos()将返回0,比方说,PENIS。 0将被转换为false。看看我要去哪里?

另外,您可能希望使用stripos(),不区分大小写(除非您只关心人们是否会出现攻击性词语): - )

答案 1 :(得分:2)

是的,你可以制作一系列坏词并从中构建一个正则表达式。这也会使处理不区分大小写变得容易。

$badwords = array('staircase', 'tuna', 'pillow');
$badwords_regex = '/' . implode('|', $badwords) . '/i';

$contains_badwords = preg_match($badwords_regex, $text);

答案 2 :(得分:2)

不,这是废话。关于string searching algorithms,有一整套计算科学。哎呀,Knuth甚至专注于TAOCP Volume 3的一半。

Boyer-Moore是一个很好的算法,现在用于许多涉及在大海捞针中搜索多个针的应用程序。

答案 3 :(得分:1)

你需要小心单词边界,否则人们会抱怨无法输入像“shuttlecock”这样的单词。

我希望您(或您的客户)意识到自动“调皮字”过滤不会消除调节的需要。有很多方法可以冒犯而不使用任何所谓的顽皮的话。即使决定什么是冒犯性的,也取决于文化背景。

答案 4 :(得分:0)

您可以将它们组合为单个正则表达式,然后使用preg_grep()来确认它们的存在

答案 5 :(得分:0)

使用值数组并迭代数组,每次检查提交的单词。如果找到匹配,则跳出循环并返回true。

答案 6 :(得分:0)

如果您正在检查一个单词,则可以使用PHP in_array函数而不是循环。如果你正在检查整个句子,那么正则表达式会更好。

http://us2.php.net/manual/en/function.in-array.php

$bad_word_array=array('weenis','dolt','wanker');

$passed=in_array($suspected_word,$bad_word_array);