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

2022-08-30 22:30:15

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

(?=^.{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个字符的长度。

特殊字符包括:

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


答案 1

我不得不同意艾伦的观点。如果现有的正则表达式如此复杂,为什么尝试只在一个正则表达式中执行此操作?

只需将其分解为平易近人的简单步骤即可。你已经做到了。

现在编写 4 个正则表达式来验证您的部件,向 4 正则表达式添加基本逻辑并测量字符串的长度。做。

您更愿意调试哪个,如下所示:

(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$(顺便说一句,这不起作用...)

或者这个:

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 

演示


答案 2

适应该正则表达式的最佳方法是将其剔除并编写一些代码。所需的正则表达式将非常长且复杂,以至于您在编写后两小时将无法读取它。等效的PHP代码将很乏味,但至少您将能够理解您编写的内容。

顺便说一句,这并不意味着对你进行猛烈抨击。在大多数情况下,正则表达式几乎不适合密码强度验证,但是您的要求比平时更复杂,而且不值得。另外,您发布的正则表达式是废话。永远不要相信你在网络上发现的正则表达式。或者任何代码,就此而言。或者,哎呀,任何东西。:-/


推荐