【问题标题】:PHP - Password RegEx requirementsPHP - 密码正则表达式要求
【发布时间】:2020-10-09 20:11:05
【问题描述】:

我正在尝试验证新用户帐户的密码是否符合以下条件:

  • 8-30 个字符之间
  • 至少包含 1 个小写字母 (a-z)
  • 至少包含 1 个大写字母 (A-Z)
  • 至少包含以下特殊字符之一:_-!#*@&

我有这样的功能:

function validPassword($str) {
    return preg_match("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[_-!#*@&])[A-Za-z\d_-!#*@&]{8,30}$", $str);
}

但是我遇到了一个错误。它应该为此密码返回“true”,例如:HelloWorld123!

但相反,它返回 false。知道可能出了什么问题吗?

if (validPassword($password) == true) {
  // good password
}

【问题讨论】:

  • 我认为你必须为模式使用分隔符。
  • 你能给我看一个你在说什么分隔符的例子吗?究竟应该放在哪里?
  • 字符类中的连字符应该在开始/结束或转义return preg_match("~^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[-_!#*@&])[A-Za-z\d_!#*@&_]{8,30}$~", $str);

标签: php regex passwords alphanumeric


【解决方案1】:

您忘记转义“-”和分隔符...

function validPassword($str) {
  return preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[_\-!#*@&])[A-Za-z\d_\-!#*@&]{8,30}$/", $str);
}

【讨论】:

  • 我不知道我必须逃避它,因为它在 [ ] 内?
  • @TibiaCams '-' 是范围字符。现在,只需将您喜欢的答案标记为已接受即可!
【解决方案2】:

您的正则表达式有错误,这就是为什么首先没有匹配项。

将您的正则表达式更改为:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[_\-!#*@&])[A-Za-z\d_\-!#*@&]{8,30}$

在这里查看您的正则表达式:https://regex101.com/r/ogPPeb/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多