【问题标题】:Password validation php regex密码验证 php 正则表达式
【发布时间】:2013-08-11 19:06:05
【问题描述】:

我是正则表达式的新手。
我需要使用 php 验证密码,并使用 Regex 使用以下密码策略:

密码:

  1. 必须至少包含 8 个字符
  2. 必须有 2 个数字
  3. 允许的符号是:! @ # $ % *

我尝试了以下方法:/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]$/

【问题讨论】:

  • 你可以在这里发布正则表达式 you have tried 并且不起作用吗?
  • @PetrR。编辑问题
  • @NullPoiиteя 请阅读 Null 问题
  • Symbols allowed are : ! @ # $ % * 部分困扰着我。为什么你只允许某些符号?您应该允许整个字符集,因为您将密码传递给像 bcrypt 这样的库,无论如何这会产生一个哈希值。你是根据你的密码,对吧?
  • 以前的问题内容非常相似,例如stackoverflow.com/questions/1615078/…stackoverflow.com/questions/7245267/… ...还要注意许多“为了$dmr 的爱,不要那样做”cmets。

标签: php regex


【解决方案1】:

以下内容完全符合您的要求:^(?=.*\d.*\d)[0-9A-Za-z!@#$%*]{8,}$

Online demo <<< You don't need the modifiers, they are just there for testing purposes.

说明

  • ^ : 匹配字符串开头
  • (?=.*\d.*\d) : 正向前瞻,检查是否有 2 位数字
  • [0-9A-Za-z!@#$%*]{8,} :匹配数字、字母和!@#$%* 8 次或更多次
  • $ : 匹配字符串结尾

【讨论】:

    【解决方案2】:

    我会先尝试找到两个数字,使用非正则表达式(或preg_match_all('[0-9]', ...) >= 2,然后验证:

    ^[!@#$%*a-zA-Z0-9]{8,}$

    这应该更快更容易理解。要仅使用正则表达式声音来做到这一点,您需要先行,它基本上会扫描表达式两次 afaik,尽管我不确定那个 PHP 的内部结构。

    准备好接受大量关于密码不被接受的投诉。我个人有很大一部分密码无法针对这些限制进行验证。像12345678 这样的无意义密码也可以验证,甚至11111111,但不是f4#f@faASvCXZr$%%zcorrecthorsebatterystaple

    【讨论】:

      【解决方案3】:
      if(preg_match('/[!@#$%*a-zA-Z0-9]{8,}/',$password) && preg_match_all('/[0-9]/',$password) >= 2)
      {
          // do
      }
      

      【讨论】:

        【解决方案4】:

        使用 PHP 进行完整的强密码验证

        • 最少 8 个字符
        • 最少一位数
        • 最少一个大写
        • 最少一个小写
        • 最少一个特殊字符

        /^\S*(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=\S*[\W])[a-zA-Z\d]{8,}\S*$/

        Demo here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-06
          • 2016-10-19
          • 2011-03-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多