以下を検証する正規表現をPHPで作成しようとしています:
- 10文字以上
- 大文字が 2 文字以上ある
- 少なくとも 2 つの数字または記号がある
私は見つけることができるほぼすべての参照を見てきましたが、役に立ちませんでした。
個別にテストできると思いますが、それは私をとても悲しくさせます:(
誰か助けてくれませんか?(そして、平易な英語の正規表現を学べる場所に私を送りますか?)
以下を検証する正規表現をPHPで作成しようとしています:
私は見つけることができるほぼすべての参照を見てきましたが、役に立ちませんでした。
個別にテストできると思いますが、それは私をとても悲しくさせます:(
誰か助けてくれませんか?(そして、平易な英語の正規表現を学べる場所に私を送りますか?)
(そしてそれは多くのエントロピーです)
(XKCD経由の画像)
これを念頭に置いて、パスワードの長さが X (たとえば.. 20) よりも長い場合はルール 2 と 3 を削除するか、最小値を少なくとも 16 文字に増やすことを検討することをお勧めします (唯一のルールとして)。
あなたの要件については:
大きくて醜く、保守が難しく、高度な RegExp を 1 つ持つのではなく、問題を小さな部分に分割し、専用の関数を使用して各ビットに個別に取り組むことをお勧めします。
ctype_*
これについては、 functions、count_chars()、およびMultiByte String Functionsを見ることができます。
今醜い:
true
この高度な正規表現は、ルールに従ってorを返しfalse
ます。
preg_match('/^(?=.{10,}$)(?=.*?[A-Z].*?[A-Z])(?=.*?([\x20-\x40\x5b-\x60\x7b-\x7e\x80-\xbf]).*?(?1).*?$).*$/',$string);
ここでデモをテスト: http://regex101.com/r/qE9eB2
1 番目の部分 (LookAhead) :(?=.{10,}$)
文字列の長さをチェックし、10 文字以上ある場合は続行します。これを削除して、 strlen()またはさらに良いmb_strlen()でチェックを行うことができます。
2 番目の部分 (これも LookAhead): (?=.*?[A-Z].*?[A-Z])
2 つの大文字の存在をチェックします。代わりに a を実行して、文字を2 つ以上$upper=preg_replace('/[^A-Z]/','',$string)
にカウントすることもできます。$upper
3rd LookAhead は文字クラスを使用します:[\x20-\x40\x5b-\x60\x7b-\x7e\x80-\xbf]
一般的な記号 (平均的なキーボードで見つけることができるほとんどすべての記号) の 16 進エスケープ文字範囲を使用します。代わりに a を実行して、文字を2 つ以上$sym=preg_replace('/[^a-zA-Z]/','',$string)
にカウントすることもできます。注:短くするために、再帰グループを使用して、同じ文字クラスを繰り返さないようにしました$sym
(?1)
学習のために、私が知っている最も包括的な RegExp リファレンスは次のとおりです: regular-expressions.info
先読みを使用して、探しているものが適切に含まれていることを確認できます。
/(?=.*[A-Z].*[A-Z])(?=.*[^a-zA-Z].*[^a-zA-Z]).{10,}/