php检测字符串是否含有重复或递增的字符
2015-09-25 10:28
633 查看
因为要对用户的密码做验证,禁止用户填写类似12345,11111,aaaaa,abcde这样重复或者递增的字符,
首先想到的是正则,正则可以使用反向引用很好的解决掉重复这种情况,但是递增这种情况没有想到要如何写这个正则(有知道的同学请麻烦留言告知,多谢);
所以想到用纯PHP做循环处理,下面是我的代码流程:
密码要求: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来决定重复或者递增的次数!
至此,整个验证结束,感觉还是比较麻烦的
首先想到的是正则,正则可以使用反向引用很好的解决掉重复这种情况,但是递增这种情况没有想到要如何写这个正则(有知道的同学请麻烦留言告知,多谢);
所以想到用纯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{ //一些错误的处理 }
相关文章推荐
- PHP代码没有解释运行,代码输出到浏览器问题
- php 以图搜图
- php中国的垃圾问题
- FTP主动模式与FTP被动模式所需的端口
- Yii2登陆添加验证码
- php设计模式之抽象工厂模式
- 分享3个php获取日历的函数
- PHP代码优化之include
- 建立基于虚拟用户的VSftpd服务
- 分享3个php获取日历的函数
- PHP简单实现断点续传下载的方法
- php实现的Curl封装类Curl.class.php用法实例分析
- ThinkPHP进程计数类Process用法实例详解
- 如何解决PHP无法实现多线程的问题
- PHP中的Session对象如何使用
- 十个PHP高级应用技巧果断收藏
- PHP防盗链的基本思想 防盗链的设置方法
- PHP生成随机字符串(3种方法)
- 腾讯CMEM的PHP扩展编译安装方法
- ThinkPHP在Cli模式下使用模板引擎的方法