php检测字符串是否含有重复或递增的字符

因为要对用户的密码做验证,禁止用户填写类似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{

<span style="white-space:pre">			</span>return '密码打头不对哦';
		}
	}else{
		return '密码不符合要求';
	}
}

密码要求:12位数字字母组成,且必须是某些字符打头,且不允许相同字符连着出现5次,或者递增5次

流程解析:

第一步:使用这则来验证是否为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{
  //一些错误的处理
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值