laravel5.5で、パスワードを英数字12文字以上 and アルファベット1文字以上 and 数字1文字以上のバリデーションを実装してみた。

laravel5.5で、パスワードを英数字12文字以上 and アルファベット1文字以上 and 数字1文字以上のバリデーションを実装してみた。

わりとそのままの参考ページがあった
https://qiita.com/mpyw/items/886218e7b418dfed254b

laravel5.5標準の登録フォームを修正

正規表現の解説(最初と最後のスラッシュは、正規表現の開始と終了を表す。)
/\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文字以上の文字列を表す正規表現を考える(否定的先読みって何だ!)