为密码检查构建一个正则表达式

时间:2017-04-29 16:09:39

标签: javascript php regex

您好我在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])$

但我不知道如何处理这个问题。在正则表达式中执行这些检查的最佳方法是什么?

1 个答案:

答案 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个或更多非空白字符
  • $ - 字符串结尾。