这个PHP正则表达式进行密码验证有什么问题?

Blu*_*ica 1 php regex

ereg("/^(?=.*[a-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])(?=.*[A-Z]).{7,19}$/","ABCabc123!!");
Run Code Online (Sandbox Code Playgroud)

这应该是一个密码验证器,需要在大写和小写字母以及数字特殊字符和最小长度8的字母表....但上面的返回false.我究竟做错了什么?

Gli*_*ire 8

preg_*改用,以及更好的验证字符串

你正在使用的正则表达式(至少)有3个问题:

  1. 你目前正在不必要地检查(?=.*[^a-zA-Z0-9])什么时候有更好的选择 - [\W_].
  2. 你至少要检查7字符19,而不是至少8.
  3. 您正在使用已弃用的功能.
  4. 您的函数允许密码中的空格.

这应该更适合你:

$regex = "/^\S*(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])(?=\S*[\W_])(?=\S{8,})\S*$/";
$valid = (bool) preg_match($regex,$password);
Run Code Online (Sandbox Code Playgroud)

这个正则表达式的组件的说明:

/            Delimiter
^            Start of string anchor
\S*          Any string without whitespace
(?=\S*[a-z]) Must contain at least 1 lowercase letter
(?=\S*[A-Z]) Must contain at least 1 uppercase letter
(?=\S*[\d])  Must contain at least 1 digit
(?=\S*[\W_]) Must contain at least 1 special character
             (note: \W will not consider underscore '_' a special character)
(?=\S{8,})   Must contain at least 8 characters
$            End of string anchor
Run Code Online (Sandbox Code Playgroud)

正如安迪莱斯特所指出的,你可能会有更多的检查

正如安迪所说,你最好存储一堆规则.这允许您定制错误消息并轻松添加规则.在PHP中,我将以这种方式实现它:

function validatePassword($password) {
    $rules = array(
        'no_whitespace' => '/^\S*$/',
        'match_upper'   => '/[A-Z]/',
        'match_lower'   => '/[a-z]/',
        'match_number'  => '/\d/',
        'match_special' => '/[\W_]/',
        'length_abv_8'  => '/\S{8,}/'
    );

    $valid = true;
    foreach($rules as $rule) {
        $valid = $valid && (bool) preg_match($rule, $password);
        if($valid !== true) break;
    }

    return (bool) $valid;
}
Run Code Online (Sandbox Code Playgroud)

现场演示可以在这里找到.