我用这个密码需要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>';
}
然而,无论我是否符合标准,我仍然会返回错误。
我也没有看到任何error_reporting消息。
任何想法可能是什么原因?
答案 0 :(得分:5)
问题是{8, 20}
中的空格,使其无法被识别为{
min ,
max { {1}}量词。但我不知道你为什么要用积极的前瞻等方式使事情复杂化;像这样简单的事应该可以解决问题:
}
已编辑添加:在密码中允许任何字符进行更好的安全措施。如果他们可以输入它,让他们使用它 - 而且你可以处理它而不会遇到SQL注入或类似问题。 (无论如何,你不会在你的数据库中存储密码,对吧?对。)
如果您想要一定数量的字符多样性以鼓励更强的密码 - 例如,至少需要一个字母,数字和两个 - 那么您可以做这样的事情。在这里,使用前瞻意味着字母,数字和上述两者都不能以密码的任何顺序出现:
preg_match('/^[A-Za-z0-9!@#$%]{8,20}$/', $_POST['password'])
您也可以尝试将长度要求纳入正则表达式,但我只是单独检查长度 - 再次,我会有最小值,但没有最大值。 (由于密码永远不应该存储,但只能进行校验和,因此较长的密码不会产生任何额外的存储开销。但如果您遇到需要限制长度的情况,请尝试选择数百个限制-of-characters范围而不是数十个字符范围。)
答案 1 :(得分:3)
请勿在{{1}}中添加空格。它应该是{8, 20}
。