Preg_match为密码总是错误

dra*_*012 0 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, !@#$% only.</div>';   
}
Run Code Online (Sandbox Code Playgroud)

但无论我是否符合标准,我仍然会返回错误.

我也没有看到任何error_reporting消息.

任何想法可能是什么原因?

Mar*_*eed 5

问题在于空间{8, 20},使其不被识别为{最小,最大}量词.但我不知道你为什么要用积极的前瞻等方式使事情复杂化; 像这样简单的事应该可以解决问题:

preg_match('/^[A-Za-z0-9!@#$%]{8,20}$/',  $_POST['password'])
Run Code Online (Sandbox Code Playgroud)

编辑添加:在密码中允许任何字符是更好的安全做法.如果他们可以输入它,让他们使用它 - 而且你可以处理它而不会遇到SQL注入或类似问题.(无论如何,你不会在你的数据库中存储密码,对吧?对.)

如果你想要一定数量的字符多样性以鼓励更强的密码 - 例如,要求至少一个字母,数字和两个 - 那么你可以做这样的事情.在这里,使用前瞻意味着字母,数字,以及上述任何一个都不能以密码中的任何顺序出现:

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

您也可以尝试将长度要求纳入正则表达式,但我只是单独检查长度 - 再次,我会有一个最小值,但没有最大值.(由于密码永远不应该存储,但只能进行校验和,因此较长的密码不会产生任何额外的存储开销.但如果您遇到需要限制长度的情况,请尝试选择数百个限制-of-characters范围而不是数十个字符范围.)