7

この式は、オフラインで借用したコードスニペットに含まれています。これにより、新しいユーザーは、上位+下位+番号を必要とするだけでなく、この順序である必要があるパスワードを使用する必要があります。下+上+数字を入力すると失敗します!

if (preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $pw_clean, $matches)) {

オンラインで検索しましたが、一部の文字の意味を教えてくれるリソースが見つかりません。パターンがpreg_match( "/ some expression /"、yourstring、your match)であることがわかります。

これらはどういう意味ですか:

1.  ^          -  ???
2.  .*         -  ???
3.  (?=.{4,})  -  requires 4 characters minimum
4.  (?.*[0-9]) -  requires it to have numbers
5.  (?=.*[a-z])-  requires it to have lowercase
6.  (?=.*[A-Z])-  requires it to have uppercase
7.  .*$        -  ???
4

3 に答える 3

17

これが直接の答えです。正規表現を理解しないと意味がないので、短くしました。その理解は、regular-expressions.infoで最もよく得られます。そこにリストされている正規表現ヘルパーツールも試してみることをお勧めします。これらのツールを使用すると、実験することができます。パターンを編集するときにライブキャプチャ/マッチングを確認してください。非常に役立ちます。


1:カレット^はアンカーであり、「干し草の山/弦/線の始まり」を意味します。

  • カレットが文字クラス内の最初のシンボルである場合[]、それは別の意味を持ちます。それはクラスを否定します。(したがって[^ab]、カレットでは、そのクラスをab以外のものと一致させます)

2:ドット.とアスタリスク*は2つの別々の目的を果たします。

  • ドットは、改行を除くすべての1文字に一致します\n
  • アスタリスクは、「前のタイプのゼロまたは多くを許可する」ことを示しています。

これら2つを組み合わせると.*、基本的に「改行または別のルールが有効になるまで、ゼロ以上の何か」と表示されます。

7:ドル$もカレットのようなアンカーであり、反対の機能である「干し草の山の終わり」です。


編集:

( )何かを囲む単純な括弧は、それをグループにします。ここに(?=)、アサーション、具体的には前向きなアサーションがあります。干し草の山の現在のカーソル位置から前方に実際に何が入っているかを確認するだけです。まだ私と一緒に?
例: その後に。が続く場合にのみfoo(?=bar)一致します。一致することはなく、返されるだけです。foobarbarfoo

これを念頭に置いて、正規表現を分析しましょう。

/^.*(?=.{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/

于 2012-04-18T04:44:08.630 に答える
2

このサイトを知らない場合は、すぐにそこに行く必要があります。

これは正規表現の聖書のようなものです。

正規表現.info

于 2012-04-18T01:00:06.633 に答える
2

To use regular expressions first you need to learn the syntax. This syntax consists in a series of letters, numbers, dots, hyphens and special signs, which we can group together using different parentheses.

Look at this link Getting Started with PHP Regular Expressions. An easy way to learn regular expressions.

于 2013-02-12T11:50:00.880 に答える