【问题标题】:Using preg_match to identify a strong password [duplicate]使用 preg_match 识别强密码 [重复]
【发布时间】:2014-09-29 18:19:52
【问题描述】:

我曾想过使用 preg_match() 来检查密码是否输入正确。我想要至少 1 个大写字母、至少 1 个小写字母、至少一个数字和至少一个特殊字符。这是我正在使用的:

$pattern = "(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$";

这个正则表达式在 HTML 的“模式”字段中运行良好。但我需要确保它也针对旧版浏览器进行了验证。

我的 PHP 代码是这样的:

if (!(preg_match($pattern, $loginpassword))) {echo "Password must include one uppercase letter, one lowercase letter, one number, and one special character such as $ or %."; die;}

我认为它工作得很好,除了当我使用密码 1@abcdeF 时它也无法匹配。 php 代码似乎可以工作,但没有密码匹配,即使它应该符合模式。 HTML5 会让它通过,所以我怀疑 regex 语句是正确的,但我在 PHP 中的设置存在缺陷。谁能看到我错过了什么?

【问题讨论】:

  • 在您的问题中包含错误消息。很明显,这个代码示例会抛出错误。
  • @Evert,我没有收到任何错误消息。只是不匹配。代码一切正常。抱歉,我会将“失败”编辑得更具体,以便清楚。

标签: php regex html


【解决方案1】:

PHP 正则表达式也需要正则表达式分隔符,所以使用:

$pattern = '/(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/';

【讨论】:

  • 我试过这个但遇到了同样的问题。它仍然没有让 !@abcdeF 通过,它应该... :-(
  • 嘿,不是说正则表达式不起作用......但我实现它的方式似乎是错误的。上面使用“preg_match”的语法是否正确?
  • 啊。刚刚意识到我的代码正在查看哈希,而不是密码。荷马辛普森...dooh。
【解决方案2】:

使用以下模式:

$strong_password = preg_match('/^(?=.[az])(?=.[AZ])(?=.\d)(? =.[^A-Za-z\d])[\s\S]{6,16}$/', $string);

^                 --> start of string

(?=.*[a-z])       --> at least one lowercase letter 

(?=.*[A-Z])       --> at least one uppercase letter 

(?=.*\d)          --> at least one number 

(?=.*[^A-Za-z\d]) --> at least one special character

[\s\S]{6,16}      --> total length between 6 and 16

$                 --> end of string

【讨论】:

  • 我建议将 2 个选择器“\s\S”替换为“\S”(字面意思是空格字符和任何非空白字符),因为您当前的解决方案允许密码超过一行。
猜你喜欢
  • 2014-12-19
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2020-07-25
  • 2014-10-26
  • 2011-10-18
相关资源
最近更新 更多