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

Jas*_*son 17 php regex passwords validation

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

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

它只在字符串中有效:

   * 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
Run Code Online (Sandbox Code Playgroud)

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

* 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
Run Code Online (Sandbox Code Playgroud)

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

特殊字符包括:

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

daw*_*awg 64

我不得不同意艾伦.如果现有的正则表达式如此复杂,为什么只在一个正则表达式中尝试呢?

把它分解成平易近人的简单步骤吧.你已经做到了.

现在编写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;
}
Run Code Online (Sandbox Code Playgroud)

为什么人们觉得他们必须写一个没有人能够理解的正则表达式,所以他们可以一次性完成它是超出我的...


好的 - 如果您真的想要一个正则表达式,请了解前瞻以验证您的规则.

这个怪物一次性完成了你的要求:

^                                        # 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 
Run Code Online (Sandbox Code Playgroud)

演示


Ala*_*ore 31

适应该正则表达式的最佳方法是将其删除并编写一些代码.所需的正则表达式将是如此漫长而复杂,您在编写它之后两小时就无法读取它.等效的PHP代码将是乏味的,但至少你将能够理解你所写的内容.

顺便说一下,这并不意味着对你的抨击.在大多数情况下,正则表达式几乎不适合密码强度验证,但是您的要求比平常更复杂,而且它不值得.另外,你发布的正则表达式是垃圾.永远不要相信你发现在网络上漂浮的正则表达式.或者任何代码,就此而言.或者,哎呀,什么.: - /

  • 我同意,最好是单独检查而不是一个魔法正则表达式.这样,您可以轻松修改特定部件或添加/删除它们.我个人认为强制使用强密码并不是一个很好的用户体验,那些基于JS的"密码强度"条形图要好得多,因为你既教育用户又温和地惩罚他们使用错误的密码,但如果他们真的想要使用一个,他们可以. (3认同)

Gum*_*mbo 16

如果你真的想使用正则表达式,试试这个:

(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$
Run Code Online (Sandbox Code Playgroud)

一些解释:

  • (?=^(?:[^A-Z]*[A-Z]){2})测试两次重复,[^A-Z]*[A-Z]除了大写字母后跟一个大写字母外,是一个零个或多个字符的序列
  • (?=^(?:[^a-z]*[a-z]){2}) (与上面的小写字母相同)
  • (?=^(?:\D*\d){2}) (与上面的数字相同)
  • (?=^(?:\w*\W){2})(与上面的非单词字符相同,但你可以改变\W你想要的任何特殊字符的字符类)
  • ^[A-Za-z\d\W]{8,}$ 测试整个字符串的长度,该字符串仅包含所有其他字符类的并集的字符.