【问题标题】:Password parameters using preg_match [duplicate]使用 preg_match 的密码参数
【发布时间】:2015-05-30 20:06:13
【问题描述】:

我正在尝试将密码参数设置为 8-20 个字符长,至少一个大写字符、数字和符号。我已经写了这样的代码

  (preg_match ('/^(\W+)(\d+)([A-Z]+)([a-z]+){8,20}$/', $_POST['pass1']) )

我对我的代码的解释如下:

W+   one or more symbols (non alpha numeric)
d+   one or more numbers
[A-Z]+  one or more uppercase characters
[a-z]+  one or more lower case characters
{8,20}  string length min 8 max 20

当我以 Anyhelp4me 的身份输入密码时!我收到无效的密码信息。你有什么建议。

【问题讨论】:

  • 以及regex101的解释:regex101.com/r/fR4xG1/1
  • 限制密码长度的目的是什么?拥有 21 个字符的密码是安全罪还是什么?

标签: php regex


【解决方案1】:

不要全部使用一个正则表达式。如果您使用多个正则表达式多次调用 preg_match,它将更易于维护、易于理解并且更容易更改。

$password_is_ok =
    preg_match( '/\W/', $pass ) &&
    preg_match( '/\d/', $pass ) &&
    preg_match( '/[a-z]/', $pass ) &&
    preg_match( '/[A-Z]/', $pass ) &&
    strlen( $pass ) >= 8 &&
    strlen( $pass ) <= 20;

对于下一个必须阅读您的代码的人(可能是您)来说,这比您可以编造的任何单一正则表达式怪物都更具可读性和可理解性。

【讨论】:

  • 很好的建议......它更“可读”和易于理解
【解决方案2】:

好的...我尝试了之前的建议,它只施加了“8,10”限制。我在 stackoverflow “创建 preg_match 以进行密码验证允许 (!@#$%)” 上找到了这一点,并修改了该响应中显示的代码,如下所示:

/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*\W)[0-9A-Za-z!@#$%]{8,20}$/

我已经测试了好几次,它确实有效。您必须至少有一个数字、一个大写字母、一个小写字母和一个指定的符号 (!@#$%),并且字符长度在 8 到 20 个之间。

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 2017-03-30
    • 2014-12-19
    • 2018-11-29
    • 2012-08-06
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多