密码强 - 不要求每个条件

时间:2010-09-26 13:47:45

标签: regex

我通过正则表达式进行密码验证。这是我的表达式:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$  

它有效 - 密码必须至少包含1位数,至少1个小写字母,至少1个大写字母和至少特殊字符:@#$%^&+=。所以我必须输入所有这些字符。

但是我想要密码,它至少有3个组合,而不是全部4个 所以这些密码应该是好的:

2Df(非特殊字符),dF#(非数字),a4%(非大写)。我想问一下,这个正则表达式应该怎么样?我可以编写每个表达式来检查每个组合,例如:

  • 不包括数字:^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
  • 不包括大写:^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).*$

但也许我可以用一个表达式来做。

2 个答案:

答案 0 :(得分:3)

为什么你使用正则表达式?只需遍历您的密码字符串并计算所需字符类型的数量。在PHP中,您可以使用count_chars()等函数。

伪代码:

      foreach(password as char) {
        if (is_digit(char))
           digits++;
        if (is_specialchar(char))
           special++;
        if (is_lower(char))
           lower++;
        if (is_upper(char))
           upper++;
        //etc
      }

现在您可以定义任何您想要的要求

      if (dgits > 0) and (lower > 0) and (special > 0)
         passowrd_ok()
      else
         password_bad()

在你的情况下,你可以聪明地计算

     if (lower > 0)
        diversity++;
     if (upper > 0)
        diversity++;
     if (special > 0)
        diversity++;
     if (digit > 0)
        diversity++;

     if (diversity >= 3)   //at least 3 different types of characters in password
        pass_ok()

答案 1 :(得分:1)

如果你必须使用正则表达式,我建议(为了清楚起见)检查所有四个条件。为了便于阅读,您可以首先尝试在密码中找到\d,然后[a-z],然后[A-Z],然后[@#$%^&+=](尽管您可能希望使用[\W_]而是允许不仅仅是那些额外的字符)。然后检查其中至少有三个是否有效。

如果 在单个正则表达式中执行此操作,则可以使用替换:

^((?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])|(?=.*[\W_])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[\W_])(?=.*\d)).*$

但这只是丑陋。