有没有用于强密码验证的PHP正则表达式?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (105)

我在网上看到了以下正则表达式。

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$

它仅在字符串:

   * contain at least (1) upper case letter
   * contain at least (1) lower case letter
   * contain at least (1) number or special character
   * contain at least (8) characters in length

我想知道如何转换这个正则表达式,以便它检查字符串

* contain at least (2) upper case letter
* contain at least (2) lower case letter
* contain at least (2) digits
* contain at least (2) special character
* contain at least (8) characters in length

那么,如果它包含至少2个上,下,数字和特殊字符,那么我不需要8个字符的长度。

特殊字符包括:

!`〜@#$%^&*()_- + = [] \ | {} ;:”',/ <>。?

提问于
用户回答回答于

适应这个正则表达式的最好方法就是把它挑出来写出一些代码。所需的正则表达式会很长很复杂,在你写完它两个小时后你将无法读取它。等价的PHP代码将是乏味的,但至少你会理解你写的东西。

用户回答回答于

如果现有的正则表达式如此复杂,为什么只在一个正则表达式中进行呢?

只需将其分解为可接近的简单步骤即可。你已经这么做了。

现在编写4 regex来验证你的部分,向4 regex添加基本逻辑,并测量字符串的长度。完成了。

或者这个:

function valid_pass($candidate) {
   $r1='/[A-Z]/';  //Uppercase
   $r2='/[a-z]/';  //lowercase
   $r3='/[!@#$%^&*()\-_=+{};:,<.>]/';  // whatever you mean by 'special char'
   $r4='/[0-9]/';  //numbers

   if(preg_match_all($r1,$candidate, $o)<2) return FALSE;

   if(preg_match_all($r2,$candidate, $o)<2) return FALSE;

   if(preg_match_all($r3,$candidate, $o)<2) return FALSE;

   if(preg_match_all($r4,$candidate, $o)<2) return FALSE;

   if(strlen($candidate)<8) return FALSE;

   return TRUE;
}

为什么人们觉得他们必须写一个没有人能理解的正则表达式,这样他们就可以一蹴而就,这是我无法理解的...

^                                        # start of line
(?=(?:.*[A-Z]){2,})                      # 2 upper case letters
(?=(?:.*[a-z]){2,})                      # 2 lower case letters
(?=(?:.*\d){2,})                         # 2 digits
(?=(?:.*[!@#$%^&*()\-_=+{};:,<.>]){2,})  # 2 special characters
(.{8,})                                  # length 8 or more
$                                        # EOL 

扫码关注云+社区

领取腾讯云代金券