3

我使用这个(几乎)复杂的密码验证:

function is_password($password) {
    return preg_match("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$", $password);
}

所以它必须包含:

  • 0-9 的一位数,
  • 一个小写字符,
  • 一个大写字符,
  • 至少 6 个字符
  • 最多 20 个字符

这似乎不起作用。每当我输入某些字符时,例如eto、和; 如果允许的长度正确,该函数返回 true。所以大写和数字没有被验证..jcb

我究竟做错了什么?

4

2 回答 2

7

你忘了使用分隔符。请改用此代码:

return preg_match("/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$/", $password);

或者您可以拆分每个条件并使用以下代码:

return mb_strlen($password)>=6 && mb_strlen($password)<=20
       && preg_match("/[a-z]+/", $password) && preg_match("/[A-Z]+/", $password)
       && preg_match("/[0-9]+/", $password);
于 2012-11-14T17:40:56.667 回答
6

我会将其分解为多个检查。这将允许您智能地向用户(或日志)反馈密码选择失败的原因。

<?php
function is_password($password){
    if (strlen($password) < 6) {
        // too short
        return false;
    }
    if (strlen($password) > 20) {
        // too long
        return false;
    }
    if (!preg_match("/[A-Z]/", $password) {
        // no upper
        return false;
    }
    if (!preg_match("/[a-z]/", $password) {
        // no lower
        return false;
    }
    if (!preg_match("/[0-9]/", $password) {
        // no digit
        return false;
    }
    return true;
}
?>
于 2012-11-14T17:45:36.593 回答