【问题标题】:Make a validation with preg_match [duplicate]使用 preg_match 进行验证 [重复]
【发布时间】:2019-03-08 02:46:18
【问题描述】:

您可以帮助我解决我遇到的这个问题,我想验证具有特定要求的密码,这些要求是: - 它必须包含一个数字、一个大写字母和一个特殊字符。它还必须介于 8 到 12 个字符之间。制作以下图案:

$special_chars = '!@#$%^&*()';
$pattern = "/[A-Z0-9{$special_chars}]{8,12}/";
$password = '$dsd%FG23X';
preg_match($pattern, $password, $matches);

但它不起作用,我需要知道正确的模式是什么。

【问题讨论】:

标签: php preg-match


【解决方案1】:

尝试使用积极的前瞻性。我使用regex101 来构建表达式。首先我们检查所需的字符,然后检查长度。这是我想出的:

$special_chars = '!@#$%^&*(),.`';
$pattern = '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[' . $special_chars . ']).*$/';

$password = '$dsd%FG23X';
preg_match($pattern, $password, $matches);

$password_validated = false;

if (strlen($password) >= 8 && strlen($password) < 50)
{
    if ( ! empty($matches)) {
        $password_validated = true;
    }
}

var_dump($password_validated);

返回:

bool(true)

顺便说一句,设置密码长度的最小值是个好主意,但设置这么短的最大值是个坏主意。您应该允许用户拥有更复杂的字符,考虑允许一些慷慨的东西,比如 50 个字符。我使用KeePass 生成密码,它们通常至少有 20 个字符长。

希望这会有所帮助!

【讨论】:

  • 但这将返回一个完全小写的字符串的值。
  • 看起来你也添加了字符[ | ] \ _ `。查看 ASCII 表,了解 A-z 包含的内容。
  • 问题是,如果你删除数字,等于返回字符串。这是有问题的,因为我想要一个需要数字、大写字母和特殊字符的模式。
  • @MarcosDavidHuarangaOrtega 我已经编辑了我的答案,现在试试。
  • 现在你的代码可以工作了。但是我之前评论的想法是删除(?=.{8,12})之前无用的.*,而不是前瞻本身。
猜你喜欢
  • 2016-09-06
  • 2018-10-11
  • 2014-12-19
  • 2010-11-19
  • 2022-01-25
  • 1970-01-01
  • 2013-10-25
  • 2018-04-08
  • 2013-02-20
相关资源
最近更新 更多