有可能有些输入,不希望让用户的评论或者私信中含有类似于QQ号,手机号的文本,比如交友网站。还有些恶意SEO通过,构造恶意检索词,检索词中包含QQ,手机号等,让百度爬取到,增加展现。也需要将这些检索词屏蔽掉。numberSafe函数通过GBK码表,判断输入是否包含连续的5个数字,中文数字,数字谐音,或者特殊中文字符(①②Ⅰ Ⅱ等)如果包含返回false,不包含返回true。
1 function numberSafe($str) { 2 //阿拉伯数字 3 $assicNum = array(48,57); 4 //中文字符 5 $chineseNum = array( 6 //特殊数字 7 '162'=>array(161,255), 8 //一 9 '210'=>array(187,239), 10 //二 11 '182'=>array(248,256), 12 '183'=>array(161,161), 13 //三 14 '200'=>array(253,256), 15 '201'=>array(161,162), 16 //四 17 '203'=>array(185,200), 18 //五 19 '206'=>array(215,243), 20 //六 零 21 '193'=>array(224,249), 22 //七 23 '198'=>array(218,253), 24 //八 25 '176'=>array(197,214), 26 //九 27 '190'=>array(190,206), 28 //十 29 '202'=>array(166,212) 30 ); 31 $str = iconv('UTF-8', 'GBK', $str); 32 $dangoursMax = $dangours = 0; 33 for ( $i = 0; $i < strlen($str) && $dangouesMax < 5; ) { 34 $assic = ord($str[$i]); 35 if ( $assic < 128 ) { 36 if ( $assic > $assicNum[0] - 1 && $assic < $assicNum[1] + 1 ) { 37 $dangours++; 38 } else { 39 $dangoursMax = max($dangours, $dangoursMax); 40 $dangours = 0; 41 } 42 $i += 1; 43 } else { 44 $assicNext = ord($str[$i+1]); 45 if ( array_key_exists($assic, $chineseNum) && $assicNext > $chineseNum[$assic][0] - 1 46 && $assicNext < $chineseNum[$assic][1] + 1 ) { 47 $dangours++; 48 } else { 49 $dangoursMax = max($dangours, $dangoursMax); 50 $dangours = 0; 51 } 52 $i += 2; 53 } 54 } 55 $dangoursMax = max($dangours, $dangoursMax); 56 return $dangoursMax < 5 ? true : false; 57 }
测试
var_dump(numberSafe('12345')); //false
var_dump(numberSafe('一二三四五')); //false
var_dump(numberSafe('一贰叁肆五')); //false
var_dump(numberSafe('衣领511')); //false
var_dump(numberSafe('⒈⒉⒊⒋⒌')); //false