Php 密码总是错误的预匹配

Php 密码总是错误的预匹配,php,passwords,preg-match,Php,Passwords,Preg Match,我使用这个密码需要8-20个字符长,只有数字、字母和!@$%符号: if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8, 20}$/', $_POST['password'])) { $errors[] = true; $_SESSION['error'] .= '<div class="messages status_red">Password must be 8-20 long, A-Z, 0-9

我使用这个密码需要8-20个字符长,只有数字、字母和!@$%符号:

if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8, 20}$/', $_POST['password'])) {
    $errors[] = true;
    $_SESSION['error'] .= '<div class="messages status_red">Password must be 8-20 long, A-Z, 0-9, !@#$% only.</div>';   
}
然而,无论我是否满足标准,我仍然返回一个错误

我也没有看到任何错误报告消息


你知道这是什么原因吗

不要在{8,20}中加空格。它应该是{8,20}。

问题是{8,20}中的空间,它阻止它被识别为{min,max}量词。但我不知道你为什么要把事情复杂化,积极地向前看等等;像这样简单的事情应该可以做到:

preg_match('/^[A-Za-z0-9!@#$%]{8,20}$/',  $_POST['password'])
编辑添加:允许密码中包含任何字符是更好的安全实践。如果他们能输入,就让他们使用它——你有责任处理它,而不必与SQL注入或类似操作相冲突。你不会在数据库中存储密码,对吧?对

如果你想要求一定数量的字符多样性,以鼓励更强大的密码-例如,要求每个字母、数字至少有一个,并且两者都不需要-那么你可以这样做。在这里,使用lookahead意味着字母、数字,并且上述任何一项都不能以任何顺序出现在密码中:

preg_match('/(?=.*[A-Za-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])/', $_POST['password'])

您也可以尝试将长度要求放入正则表达式中,但我只需单独检查长度,这里我会有一个最小值,但没有最大值。由于密码永远不应该存储,而应该只进行校验和,因此较长的密码不应该产生任何额外的存储开销。但是,如果您确实遇到由于某种原因需要限制长度的情况,请尝试选择数百个字符范围内的限制,而不是数十个字符范围内的限制。

仅限数字、字母和!@$%-这是一个愚蠢的限制。不要限制用户在密码中使用什么字符您需要转义$。。。[A-Za-z][0-9A-Za-z!@\$%]@Eugen Rieck:不,字符集中的$不应该是escaped@zerkms我已更正,留下评论供将来参考。为什么要限制字符集?除了字母、数字和标点符号之外,似乎至少需要一个字母、一个数字和一个标点符号或类似符号更有用。