因为要对用户的密码做验证,禁止用户填写类似12345,11111,aaaaa,abcde这样重复或者递增的字符,
首先想到的是正则,正则可以使用反向引用很好的解决掉重复这种情况,但是递增这种情况没有想到要如何写这个正则(有知道的同学请麻烦留言告知,多谢);
所以想到用纯PHP做循环处理,下面是我的代码流程:
function check_code($str){
$isok = true;
$preg_code = '/^[0-9A-Z]{12}$/';
if(preg_match_all($preg_code,$str,$matchc)){
$tou = array('A3','A4','A5','A6','A7','A9','C7','C9','C3','C4','C5','C6','D3','D4','D5','D6','D7','D9','HM');
$u_tou = substr($str,0,2);
if(in_array($u_tou,$tou)){
for($i=0;$i<=7;$i++){
$five = $str{$i}.$str{$i+1}.$str{$i+2}.$str{$i+3}.$str{$i+4};
$now_chong = $str{$i}.$str{$i}.$str{$i}.$str{$i}.$str{$i};
$now_zeng = $str{$i}.chr(ord($str{$i})+1).chr(ord($str{$i})+2).chr(ord($str{$i})+3).chr(ord($str{$i})+4);
if($five==$now_chong){
$isok = false;
break;
}elseif($five==$now_zeng){
$isok = false;
break;
}
}
if($isok){
return '正确';
}else{
return '密码禁止重复或递增';
}
}else{
return '密码打头不对哦';
}
}else{
return '密码不符合要求';
}
}
流程解析:
第一步:使用这则来验证是否为12位的数字字符组合;
第二步:判断密码是否为必须某些字符打头的字符
第三步:最关键的一步:
1,因为有5这个限制,所以待检测的字符我们只需要检测到第8个字符即可,后面9-12个字符无论是连续还是递增都是小于5的
2,对字符做循环,我们的思路是取当前循环的字符及其后面的四个生成一个新的字符$five;然后再根据当前循环的字符生成一个重复的字符$now_chong及一个递增字符$now_zeng;然后非别让$five与$now_chong,$now_zeng比较,只要相等就设置$isok(默认为true)为false;
第四步:封装成一个函数即可
最后要说的:$now_chong这个变量很好生成,直接连接就行;$now_zeng有些麻烦,因为英文字母的递增要麻烦些,还要区分大小写,想了几个方法都比较繁琐,最后找到个不错的方法,我利用函数ord()将字符统一转为ascii码,这样所有的字符都是十进制的了,然后一次递增即可,最后再用函数chr()转为正常的字符即可,这是我能想到最好的方法(有更好的方法的同学 麻烦留言告知 多谢);这里是区分大小写的即aaaaA是允许的,如果想不被允许,可在检测开始将字符统一转为大写(strtoupper)或者小写(strtolower)即可;可以更改5来决定重复或者递增的次数!
至此,整个验证结束,感觉还是比较麻烦的
$ucode = 'A31234B5678C'
$check = check_code($ucode);
if($check=='正确'){
//一些正确的操作
}else{
//一些错误的处理
}