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的长度,只包含所有其他字符类的联合字符。