首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于强密码验证的PHP正则表达式

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

Stack Overflow用户
提问于 2010-04-14 21:51:49
回答 3查看 42K关注 0票数 17

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

代码语言:javascript
复制
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$

它仅在以下情况下验证:

代码语言:javascript
复制
   * 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

我想知道如何将这个正则表达式转换为

代码语言:javascript
复制
* 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个字符的长度。

特殊字符包括:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-14 22:06:11

适应该正则表达式的最好方法是丢弃它,转而编写一些代码。所需的正则表达式将是如此冗长和复杂,以至于您在编写它两个小时后无法阅读它。等效的PHP代码会很单调乏味,但至少您能够理解您所编写的内容。

顺便说一句,这不是对你的猛烈抨击。正则表达式在大多数情况下只是勉强适用于密码强度验证,但是您的需求比通常情况下更复杂,这是不值得的。另外,你发布的正则表达式也是垃圾。永远不要相信你在web上发现的那些正则表达式。或者任何代码,就这点而言。或者,见鬼,什么都行。:-/

票数 31
EN

Stack Overflow用户

发布于 2010-04-15 00:25:34

我不得不同意艾伦的观点。如果现有的正则表达式如此复杂,为什么还要在一个正则表达式中完成它呢?

只要把它分解成容易接近的简单步骤即可。您已经这样做了。

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

你更愿意调试哪一个,这个:

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

或者这样:

代码语言:javascript
复制
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;
}

为什么人们觉得他们必须编写一个没有人能理解的正则表达式,这样他们就可以一口气完成它,这超出了我的理解……

好的,好的--如果您真的想要一个正则表达式,那么学习lookaheads来验证您的规则。

这个怪物一下子就完成了你要求的事情:

代码语言:javascript
复制
^                                        # 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 

Demo

票数 65
EN

Stack Overflow用户

发布于 2010-04-14 22:19:00

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

代码语言:javascript
复制
(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$

一些解释:

  • (?=^(?:[^A-Z]*[A-Z]){2})测试两次重复的letter
  • (?=^(?:[^a-z]*[a-z]){2})[^A-Z]*[A-Z]是除大写字母后跟一个大写letter
  • (?=^(?:[^a-z]*[a-z]){2})之外的一个由零个或多个字符组成的序列(与上面的小写letters)
  • (?=^(?:\D*\d){2})相同(对于非单词字符,与上面的相同,但您可以使用任何特殊字符来更改\W,只要您want)
  • ^[A-Za-z\d\W]{8,}$测试的整个字符串的长度仅由所有其他字符类的联合字符组成)。
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2637896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档