laravel5.5で、パスワードを英数字12文字以上 and アルファベット1文字以上 and 数字1文字以上のバリデーションを実装してみた。
わりとそのままの参考ページがあった
https://qiita.com/mpyw/items/886218e7b418dfed254b
laravel5.5標準の登録フォームを修正
1 2 3 4 5 6 7 8 9 10 11 |
// app/Http/Controller/Auth/RegisterController.php protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], // 12文字以上&英数字(アルファベット・数字は最低1文字以上は使用する) 'password' => ['required', 'string', 'regex:/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{12,}+\z/i'], 'email' => ['required', 'email', 'max:255'], ]); } |
正規表現の解説(最初と最後のスラッシュは、正規表現の開始と終了を表す。)
/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{12,}+\z/i
\A = ^(ハットと同じで、行の先頭を表す)
(?=.*?[a-z]) = 肯定的先読み(アルファベットの前に何かある) = アルファベットが1文字以上使われている!
(?=.*?\d) = 肯定的先読み(数字の前に何かある) = 数字が1文字以上使われている!
[a-z\d] = アルファベットと数字(digit)
{12,} = {最低文字数, 最大文字数}
+ = 直前の指定文字の1文字以上の繰り返し
\z = $(ドルマークと同じで、行末を表す)
最後のi = アルファベットの大文字・小文字を区別しない
肯定的先読みが非常にややこしいので、もう一回説明
a(?=b)
と書くと、aの次の文字がbだったaにヒットする。(abcとかにヒットするけど、aだけヒットして、abじゃない)
(?=.*?\d)を分解してみると
(?= 「肯定的先読み」の宣言
.*? 何らかの文字がある(ない場合もHit)「任意の1文字の0回以上の最短連続」
\d) 数字の前に
自分でも以前にまとめていた。ややこしい!
否定にマッチする正規表現は難しい、前後に空白が含まれていない1文字以上の文字列を表す正規表現を考える(否定的先読みって何だ!)
一般的なパスワード(8文字以上、アルファベット・数字を、最低1文字以上は使用する)なら、以下の通り
1 |
'password' => ['required', 'string', 'regex:/\A(?=.*?[a-zA-Z])(?=.*?\d)[a-zA-Z\d]{8,}+\z/'], |