这个贝叶斯方法,我用于过滤联系人提交和报价表格的请求相当成功。该表格使用评分并处理来自世界各地的各种语言的请求。如果他们在各个领域只有3或4次测试失败,那么我将它们标记为垃圾邮件尝试。很显然,像'123456'这样的东西会立即为电话号码发出红旗。另外BBCode在评论中是一个死的赠品。
<?php
function nameCheck($var) {
$nameScore = 0;
//If name < 4 score + '3'
$chars_count = strlen($var);
$consonants = preg_replace('![^BCDFGHJKLMNPQRSTVWXZ]!i','',$var);
$consonant_count = strlen($consonants);
$vowels = preg_replace('![^AEIOUY]!i','',$var);
$vowel_count = strlen($vowels);
//We're expecting first and last name.
if ($chars_count < 4){
$nameScore = $nameScore + 3;
}
//if name > 4 and no spaces score + '4'
if (($chars_count > 4)&& (!preg_match('![ ]!',$var))){
$nameScore = $nameScore + 4;
}
if (($chars_count > 4)&&(($consonant_count==0)||($vowel_count==0))){
$nameScore = $nameScore + 5;
}
//if name > 4 and vowel to consonant ratio < 1/8 score + '5'
if (($consonant_count > 0) && ($vowel_count > 0) && ($chars_count > 4) && ($vowel_count/$consonant_count < 1/8)){
$nameScore = $nameScore + 5;
}
//Needs at least 1 letter.
if (!preg_match('![A-Za-z]!',$var)){
$nameScore = $nameScore + 10;
}
return $nameScore;
}
//added for testing
$var = $_GET['email'];
echo nameCheck($var);
?>
即使有人冲我有它复制我的尝试,所以我可以修复我的得分。中文或韩文通常会有一些误报,但大部分情况下,任何人填写英文表格都会通过。像“无锡”这样的名字确实存在。
第一个引用问题的接受答案是你应该采取的答案。这取决于你自己/管理部门监控数据库并对无效名称发出不良/惩罚/惩罚 – 2013-03-28 03:04:43
出于兴趣,你为什么要这样做? – Jim 2013-03-28 03:08:21
您可以查看[Levenshtein](http://php.net/manual/en/function.levenshtein.php)以及从那里链接的其他类似功能。就像BCS碗的选择一样,只是通过一系列不同的测试来折腾他们,看看最终结果如何。但是,您可能需要一些原型。 – 2013-03-28 03:08:38