PHP正则expression式进行强密码validation

我在网上看到了下面的正则expression式。

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[AZ])(?=.*[az]).*$ 

它只validationstring:

  * 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 

我想知道如何转换这个正则expression式,以便它检查string

 * 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 

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

特殊字符包括:

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

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

顺便说一下,这并不意味着对你的大满贯。 在大多数情况下,正则expression式几乎不适用于密码强度validation,但是您的需求比平常更复杂,而且不值得。 此外,你张贴的正则expression式是废话。 永远不要相信你在networking上浮动的正则expression式。 或者任何代码,就此而言。 或者, 什么都可以 。 : – /

我不得不同意艾伦。 如果现有的正则expression式非常复杂,为什么只用一个正则expression式呢?

把它分解成简单易懂的步骤。 你已经做到了。

现在编写4个正则expression式来validation你的部件,给4个正则expression式添加基本的逻辑,并测量string的长度。 完成。

你宁愿debugging,这个:

(?=^(?:[^AZ]*[AZ]){2})(?=^(?:[^az]*[az]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$

或这个:

 function valid_pass($candidate) { $r1='/[AZ]/'; //Uppercase $r2='/[az]/'; //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; } 

为什么人们觉得他们必须写一个没有人能理解的正则expression式,所以他们一次就可以做到这一点超出了我的想象……


好的好吧 – 如果你真的想要一个正则expression式,请了解一下lookahead来validation你的规则。

这个怪物一气呵成地问你:

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

演示

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

 (?=^(?:[^AZ]*[AZ]){2})(?=^(?:[^az]*[az]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$ 

一些解释:

  • (?=^(?:[^AZ]*[AZ]){2})testing[^AZ]*[AZ]两个重复,它是一个零个或多个字符序列,除大写字母后面跟一个大写字母
  • (?=^(?:[^az]*[az]){2}) (与上面小写字母相同)
  • (?=^(?:\D*\d){2}) (与上面的数字相同)
  • (?=^(?:\w*\W){2}) (与上面的非单词字符相同,但是您可以使用任何特殊字符的字符类来更改\W
  • ^[A-Za-z\d\W]{8,}$testing整个string的长度,只包含所有其他字符类的联合字符。