有可能有些输入,不希望让用户的评论或者私信中含有类似于QQ号,手机号的文本,比如交友网站。还有些恶意SEO通过,构造恶意检索词,检索词中包含QQ,手机号等,让百度爬取到,增加展现。也需要将这些检索词屏蔽掉。numberSafe函数通过GBK码表,判断输入是否包含连续的5个数字,中文数字,数字谐音,或者特殊中文字符(①②Ⅰ Ⅱ等)如果包含返回false,不包含返回true。
function numberSafe($str) {
//阿拉伯数字
$assicNum = array(48,57);
//中文字符
$chineseNum = array(
//特殊数字
'162'=>array(161,255),
//一
'210'=>array(187,239),
//二
'182'=>array(248,256),
'183'=>array(161,161),
//三
'200'=>array(253,256),
'201'=>array(161,162),
//四
'203'=>array(185,200),
//五
'206'=>array(215,243),
//六 零
'193'=>array(224,249),
//七
'198'=>array(218,253),
//八
'176'=>array(197,214),
//九
'190'=>array(190,206),
//十
'202'=>array(166,212)
);
$str = iconv('UTF-8', 'GBK', $str);
$dangoursMax = $dangours = 0;
for ( $i = 0; $i < strlen($str) && $dangouesMax < 5; ) {
$assic = ord($str[$i]);
if ( $assic < 128 ) {
if ( $assic > $assicNum[0] - 1 && $assic < $assicNum[1] + 1 ) {
$dangours++;
} else {
$dangoursMax = max($dangours, $dangoursMax);
$dangours = 0;
}
$i += 1;
} else {
$assicNext = ord($str[$i+1]);
if ( array_key_exists($assic, $chineseNum) && $assicNext > $chineseNum[$assic][0] - 1
&& $assicNext < $chineseNum[$assic][1] + 1 ) {
$dangours++;
} else {
$dangoursMax = max($dangours, $dangoursMax);
$dangours = 0;
}
$i += 2;
}
}
$dangoursMax = max($dangours, $dangoursMax);
return $dangoursMax < 5 ? true : false;
}
测试
var_dump(numberSafe('12345'));//false
var_dump(numberSafe('一二三四五'));//false
var_dump(numberSafe('一贰叁肆五'));//false
var_dump(numberSafe('衣领511')); //false
var_dump(numberSafe('⒈⒉⒊⒋⒌'));//false