ereg("/^(?=.*[a-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])(?=.*[A-Z]).{7,19}$/","ABCabc123!!");
これは、大文字と小文字のアルファベット、数字、特殊文字、最小長 8 を必要とするパスワード バリデータであるはずですが、上記は false を返します。私は何を間違っていますか?
preg_*
し、より良い検証文字列使用している正規表現には (少なくとも) 3 つの問題があります。
(?=.*[^a-zA-Z0-9])
現在、これを行うためのより良いオプションがあるかどうかを不必要にチェックしています- [\W_]
.7
文字数で19
はなく、文字数以下をチェックしています8
。これはあなたにとってよりうまくいくはずです:
$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;
}
ライブ デモンストレーションはこちらでご覧いただけます。