标签 正则表达式 下的文章

起因:
书上有个题,让判断所给数据是否符合如下条件:

1.8-10位
2.包含英文字母(大小写任意)
3.包含数字

我的方案:

$len=strlen($pwd);
if ($len>=8 and $len<=10){
    if(preg_match('/[A-Z]/',$pwd)){
        if(preg_match('/\d/',$pwd)){
            echo '奥利给!';
        }
    }
}else{
    echo '不奥利给!';
}

看了眼标答,我嘞个去,啥玩意儿?

function checkPasswordSafe($password){
$pattern = '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/'; // 必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间
if(preg_match($pattern,$password)){
    echo "密码较强";
}else{
    echo "密码较弱";
}

这..啥玩意儿?

1.(?= 通俗一点就是,你后边得有我等号后的内容,但是呢,我匹配到的内容只是这前头的东西。
比方说:Xiaomi(?=5|6|7|8|9|10),对于Xiaomi5,匹配到的结果是Xiaomi(没有5哦),但是对于Xiaomi4,就匹配不到!

2.(?! 通俗一点就是跟上面那个玩意儿反过来!
比方说:Xiaomi(?!5|6|7|8|9|10),对于Xiaomi5,匹配不到的,但是对于Xiaomi4,匹配得到,结果是Xiaomi(没有4)。

3.(?: 通俗一点就是,你后边得有我等号后的内容,但是呢,我匹配到的内容既包含前头也包含后头。
比方说:Xiaomi(?=5|6|7|8|9|10),对于Xiaomi5,匹配到的结果是Xiaomi5(有5啦),但是但是对于Xiaomi4,就匹配不到!

还有(?<= (?<! 就是把它们放到一串东西前面就可以啦!

回到刚开始的那个问题吧!

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

用了波在线正则工具,发现上边这个好像行不通啊,但是在php中是可以实现的。
我改了下,^((?=.*\d)|(?=.*[a-z])|(?=.*[A-Z])).{8,10}$,顺利通过检阅。
来个大佬帮我解释一下呗 /doge 谢谢~

刚刚写完重新看了一眼,没加代码块的米字号啊斜杠啊全给我转义了,害。