2013-05-13 62 views
0

我用这对一个需要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消息。

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

+7

“只有数字,字母和!@#$%”---这是一个*愚蠢*限制。不要限制用户在他们的密码中使用什么字符 – zerkms 2013-05-13 23:26:08

+0

您需要转义'$'... [A-Za-z])[0-9A-Za-z!@#\ $%] – 2013-05-13 23:26:21

+0

@Eugen Rieck:字符集中不应该有'$' – zerkms 2013-05-13 23:26:39

回答

3

请勿在{8, 20}中放置空间。它应该是{8,20}

5

的问题是在{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']) 

你可以尝试获得长度要求为正则表达式,也但我会单独检查长度 - 在这里再次,我会有一个最小值,但没有最大值。 (由于密码永远不会被存储,但只能进行校验和,所以更长的密码不应该产生额外的存储开销,但是如果你遇到了由于某种原因需要限制长度的情况,可以尝试选择数百字符范围而不是数十个字符范围。)