【问题标题】:build a regex for password check为密码检查构建一个正则表达式
【发布时间】:2017-04-29 16:09:38
【问题描述】:

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

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

【问题讨论】:

  • 天哪,每个人都讨厌这个。 “您的密码长度必须至少为 24 个字符,至少包含 1 个数字、1 个大写字母、1 个小写字母、1 个特殊字符、1 个玛雅符号和 1 个埃及象形文字,不得以任何方式看起来像您以前的密码,并且将一周后到期。” _离开网站_
  • 我不同意 Aa@1 将解析为有效通行证......在这个时代,培训用户使用强密码很重要。尽管你讨厌它。如果每个网站都需要这个,那将是标准
  • 尝试一键式 Google 或 Facebook 登录按钮。您必须在便利贴上写不可能的密码对用户来说是一个很大的禁忌。

标签: javascript php regex


【解决方案1】:

您的^(?=.*[^a-zA-Z])(?=.*[a-z])(?=.*[A-Z])$ 模式是一个永远不会匹配的正则表达式示例,因为使用前瞻,您需要至少 1 个非字母、大写和小写字母,但使用模式仅匹配空字符串。

您可以使用单个正则表达式,例如

^(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*()_=+{}:<.>-])(?=.*[0-9])\S*$

如果您需要设置最小字符数,请将最后一个 * 替换为限制量词,例如{8,} 至少需要 8 个字符。

请参阅regex demo

详情

  • ^ - 字符串开头
  • (?=.*[A-Z]) - 至少一个大写字母
  • (?=.*[a-z]) - - 至少一个小写
  • (?=.*[!@#$%^&amp;*()_=+{}:&lt;.&gt;-]) - 至少一个特殊字符
  • (?=.*[0-9]) - 至少一位数
  • \S* - 0 个或多个非空白字符
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2010-11-12
    • 2016-10-30
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多