您好我在PHP中进行了密码强度检查。看起来像这样:
public static function validPass($candidate) {
$r1 = '/[A-Z]/'; //1 upper
$r2 = '/[a-z]/'; //2 lower
$r3 = '/[!@#$%^&*()\-_=+{}:<.>]/'; //1 special char
$r4 = '/[0-9]/'; //1 number
//no space
if (preg_match('/\s/',$candidate)) {
return false;
}
if (preg_match_all($r1, $candidate, $o) < 1) {
return false;
}
if (preg_match_all($r2, $candidate, $o) < 1) {
return false;
}
if (preg_match_all($r3, $candidate, $o) < 1) {
return false;
}
if (preg_match_all($r4, $candidate, $o) < 1) {
return false;
}
return true;
}
所以1个大写,1个较低,1个数字,1个特殊字符,不允许空格
现在我正在为前端使用javascript验证器,我可以为密码添加的唯一自定义功能是添加正则表达式,所以我必须将其构建为正则表达式。我试过了,到目前为止:
^(?=.*[^a-zA-Z])(?=.*[a-z])(?=.*[A-Z])$
但我不知道如何处理这个问题。在正则表达式中执行这些检查的最佳方法是什么?
答案 0 :(得分:3)
您的^(?=.*[^a-zA-Z])(?=.*[a-z])(?=.*[A-Z])$
模式是永远不会匹配的正则表达式的示例,因为对于前瞻,您需要至少1个非字母,大写和小写字母,但使用模式仅匹配空字符串。 / p>
您可以使用单个正则表达式
^(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*()_=+{}:<.>-])(?=.*[0-9])\S*$
如果您需要设置最小字符数,请将最后一个*
替换为限制量词,例如{8,}
需要至少8个字符。
请参阅regex demo。
<强>详情:
^
- 字符串开头(?=.*[A-Z])
- 至少一个大写(?=.*[a-z])
- - 至少一个小写(?=.*[!@#$%^&*()_=+{}:<.>-])
- 至少一个特殊字符(?=.*[0-9])
- 至少一位数\S*
- 0个或更多非空白字符$
- 字符串结尾。