纯真 - PHP
type: channel
link: http://geng.cz/tag/PHP/
items: Mark一下正则中(?: (?= (?!的用法

Mark一下正则中(?: (?= (?!的用法
type: item
date: 2020-08-06T06:19:00+08:00
description: 起因：书上有个题，让判断所给数据是否符合如下条件：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 谢谢~刚刚写完重新看了一眼，没加代码块的米字号啊斜杠啊全给我转义了，害。