的preg_match密码总是错误
问题描述:
我用这对一个需要8-20密码字符长,只有数字,字母和@#$%符号:的preg_match密码总是错误
if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[[email protected]#$%]{8, 20}$/', $_POST['password'])) {
$errors[] = true;
$_SESSION['error'] .= '<div class="messages status_red">Password must be 8-20 long, A-Z, 0-9, [email protected]#$% only.</div>';
}
但是不管我符合标准或不符合我仍然返回一个错误。
我也没有看到任何error_reporting消息。
任何想法可能是什么原因呢?
答
请勿在{8, 20}
中放置空间。它应该是{8,20}
。
答
的问题是在{8, 20}
的空间中,其保持它被识别为{
分钟,
最大}
量词。但我不知道为什么你用积极的lookahead等来复杂化事物;因为这应该做的伎俩简单的东西:
preg_match('/^[[email protected]#$%]{8,20}$/', $_POST['password'])
编辑补充:这将是更好的安全习惯,以允许任何字符在所有的密码。如果他们可以键入它,让他们使用它 - 并且它是在你能够处理它,而不会与SQL注入或类似的冲突。 (你不要在你的数据库中存储密码无论如何,对不对?)
如果你希望要求,以一定量的性格的多样性,鼓励更强的密码 - 例如,要求每个字母至少一个,数字,也没有 - 那么你可以做这样的事情。在这里,用超前的表示字母,数字,也不-的最上方可以以任意顺序在密码发生:
preg_match('/(?=.*[A-Za-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])/', $_POST['password'])
你可以尝试获得长度要求为正则表达式,也但我会单独检查长度 - 在这里再次,我会有一个最小值,但没有最大值。 (由于密码永远不会被存储,但只能进行校验和,所以更长的密码不应该产生额外的存储开销,但是如果你遇到了由于某种原因需要限制长度的情况,可以尝试选择数百字符范围而不是数十个字符范围。)
“只有数字,字母和!@#$%”---这是一个*愚蠢*限制。不要限制用户在他们的密码中使用什么字符 – zerkms 2013-05-13 23:26:08
您需要转义'$'... [A-Za-z])[0-9A-Za-z!@#\ $%] – 2013-05-13 23:26:21
@Eugen Rieck:字符集中不应该有'$' – zerkms 2013-05-13 23:26:39