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

これは、大文字と小文字のアルファベット、数字、特殊文字、最小長 8 を必要とするパスワード バリデータであるはずですが、上記は false を返します。私は何を間違っていますか?

4

2 に答える 2

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);

この正規表現の構成要素の説明:

/            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

Andy Lester が指摘したように、複数のチェックを行ったほうがよい場合があります。

Andy が述べたように、一連のルールを保存するのが最善です。これにより、エラー メッセージを調整し、ルールを簡単に追加できます。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;
}

ライブ デモンストレーションはこちらでご覧いただけます

于 2013-09-05T16:34:46.637 に答える