これが直接の答えです。正規表現を理解しないと意味がないので、短くしました。その理解は、regular-expressions.infoで最もよく得られます。そこにリストされている正規表現ヘルパーツールも試してみることをお勧めします。これらのツールを使用すると、実験することができます。パターンを編集するときにライブキャプチャ/マッチングを確認してください。非常に役立ちます。
1:カレット^
はアンカーであり、「干し草の山/弦/線の始まり」を意味します。
- カレットが文字クラス内の最初のシンボルである場合
[]
、それは別の意味を持ちます。それはクラスを否定します。(したがって[^ab]
、カレットでは、そのクラスをab以外のものと一致させます)
2:ドット.
とアスタリスク*
は2つの別々の目的を果たします。
- ドットは、改行を除くすべての1文字に一致します
\n
。
- アスタリスクは、「前のタイプのゼロまたは多くを許可する」ことを示しています。
これら2つを組み合わせると.*
、基本的に「改行または別のルールが有効になるまで、ゼロ以上の何か」と表示されます。
7:ドル$
もカレットのようなアンカーであり、反対の機能である「干し草の山の終わり」です。
編集:
( )
何かを囲む単純な括弧は、それをグループにします。ここに(?=)
、アサーション、具体的には前向きなアサーションがあります。干し草の山の現在のカーソル位置から前方に実際に何が入っているかを確認するだけです。まだ私と一緒に?
例: その後に。が続く場合にのみfoo(?=bar)
一致します。一致することはなく、返されるだけです。foo
bar
bar
foo
これを念頭に置いて、正規表現を分析しましょう。
/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/
Reads as:
^.* From Start, capture 0-many of any character
(?=.{4,}) if there are at least 4 of anything following this
(?=.*[0-9]) if there is: 0-many of any, ending with an integer following
(?=.*[a-z]) if there is: 0-many of any, ending with a lowercase letter following
(?=.*[A-Z]) if there is: 0-many of any, ending with an uppercase letter following
.*$ 0-many of anything preceding the End
パスワード文字の順序が重要だとあなたは言います-それは私のテストではありません。以下のテストスクリプトを参照してください。これが1つか2つのことをクリアしたことを願っています。もう少し寛容な別の正規表現を探している場合は、正規表現のパスワード検証を参照してください
<pre>
<?php
// Only the last 3 fail, as they should. You claim the first does not work?
$subjects = array("aaB1", "Baa1", "1Baa", "1aaB", "aa1B", "aa11", "aaBB", "aB1");
foreach($subjects as $s)
{
$res = preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $s, $matches);
echo "result: ";
print_r($res);
echo "<br>";
print_r($matches);
echo "<hr>";
}
Excellent online tool for checking and testing Regular Expressions:
https://regex101.com/