ホームページ > 記事 > ウェブフロントエンド > 通常のIPマッチングの詳細なグラフィックとテキストの説明
今回は、通常のIPマッチングについて画像とテキストで詳しく説明します。実際のIPマッチングの注意点を見てみましょう。
ここではIPアドレスにマッチする正規表現について詳しく説明します
正規表現についての知識は詳しい説明の中で触れます。
説明する前に、まずはIPアドレス生成のルールをご紹介します。
IPアドレスは、32桁の2進数を4つの10進数の文字列に変換して構成されます。
変換するにはどうすればいいですか?以下で説明します:
バイナリ: 11111111111111111111111111111
4 つの部分に分割: 11111111.11111111.11111111.11111111
変換: 2^7+2^6+2^5+2^ 4+2^3+2^2+2^1+ 2^0=255
10進数に変換: 0~255.0~255.0~255.0~255
IPアドレスの範囲です。
IP生成のルールと範囲に基づいて、正規表現を使用してIPアドレスを照合できますが、どのように照合するのでしょうか?人それぞれ独自の方法があると思いますが、ここでは私のアプローチを説明します。
IP アドレスの文字列規則に基づいて、IP アドレスに一致する式を 2 つの部分に分けて検討しました。
being-being's being made to be so
この文字列をクリックして、一致を 3 回繰り返し、最後の数字の部分 0 ~ 255 を一致させます。これが私の考えたIPアドレスの一致です。
まず最初に、正規表現で数値演算を行う方法はないため、数値演算を使用して IP の数値範囲をフィルタリングすることはできないことを述べておきたいと思います。数値演算を使用して IP の数値範囲をフィルタリングする方法がないため、この数値範囲をフィルタリングするには他にどのような方法を使用すればよいでしょうか?私のアイデアは、
グループで話し合い、その後、これらのグループを統合してデジタル範囲の IP を形成することです。 ②. 最初の数値が 2 だとすると、IP 番号の範囲規則に従って、ここには 2 つの状況が存在します。考えてみてください。最大の数は 255 です。十の位が 5 のとき、一の位は最大でも 5 までですよね。そして、十の位が0~4の場合、一の位はどんな数字でもいいですよね?したがって、ここでの 2 つの状況は次のとおりです: A, 2 [0-4] [0-9] B, 25 [0-5] ③ ③、100 桁の状況を分析し、それを取得します 次はケースです10の位の場合、10の位の前の最初の数字はゼロにはなりませんよね? したがって、10 桁の状況は次のようになります: [1-9][0-9] ④. 残りは 1 桁の状況です。 : [0-9]。 4 つの状況を分析した結果、次のような IP 番号の範囲グループ化が得られました。 - 5] [1-9][0-9] [0-9] [0-9] [0-9] 死ぬこれは非常に簡単で、正規の or 記号 | とグループ化記号 () を使用するだけです。つまり、上記のグループ化正規表現は次のようになります。(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])
ここでは、数字の個数の正規表現が書かれているので、前回のアイデアに従って、最初の部分: 3 0 ~ 255 に一致します。 0 ~ 255 の数字を
最初のものに一致させますIP アドレスの一部の正規表現は次のとおりです:
(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)
0~255 に一致するように各数値の後にドットを追加しました。では、試合を繰り返す方法3回?これら 5 つのパケットを全体として扱い、一致を 3 回繰り返す限り、正規表現は次のようになります。
((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9])\.)){3}
部分の最初の部分が一致し、次の部分が一致しました。ステッチは数字の数、数字の部分の上の数字の部分です 非常にわかりやすく書かれているので、これ以上説明しません。 完全な正規表現は次のとおりです:
((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))
この時点で、マッチングのための正規表現は次のとおりです。 IP が出てきましたが、これが IP を一致させるための最終的な正規表現ではありません。なぜでしょうか。非常に単純です。正規表現は各グループをキャプチャして照合します。一致する IP は非常に多くのグループに分割されており、各グループの内容は上記の正規表現によってキャプチャされている数がわかりません。 、笑、では、グループ化されたコンテンツを削除するにはどうすればよいでしょうか?非常に簡単です。この記号を使用します。 ?:
?: 記号は () 括弧内に配置されます。これは、正規表現の内容ではなくグループをキャプチャすることを意味します。では、各グループに入れてしまうと、そのグループのコンテンツは削除されてしまうのではないでしょうか?したがって、各グループに ?: を追加する必要があります。追加後の正規表現は次のとおりです。
(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))
ここでも、IP アドレスは一致しません。また、先頭と $ を使用して制限する必要があります。文字列の最後にあるので、IP アドレスを一致させるための最終的な正規表現は次のとおりです:
^(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$
これは、他の読者を誤解させないように、バグを報告することを歓迎します。 。
上記の正規表現の () 括弧はすべてペアで表示されます。もしペアで表示されるものがあれば、自分で追加してください。
以下は私のテストです:
<?php $pattern = '/^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/'; //正则匹配ip地址 $ip = '254.21.0.198'; preg_match($pattern,$ip,$out); echo '<pre class="brush:php;toolbar:false">'; print_r($out); $ip = '255.777.0.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '07.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '1207.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = 'qq107.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '\.\.\.107.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '\.\.\. 7.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '107.25.8.19822vvv'; preg_match($pattern,$ip,$out); print_r($out); $ip = '107.25.r8.1982'; preg_match($pattern,$ip,$out); print_r($out); $ip = '107.225.8.19'; preg_match($pattern,$ip,$out); print_r($out); $ip = '225.225.225.225'; preg_match($pattern,$ip,$out); print_r($out); $ip = '0.0.0.0'; preg_match($pattern,$ip,$out); print_r($out); $ip = '00.0.0.0'; preg_match($pattern,$ip,$out); print_r($out); $ip = '0.202.1.0'; preg_match($pattern,$ip,$out); print_r($out); $ip = '0.202.1.226'; preg_match($pattern,$ip,$out); print_r($out); $ip = '249.202.1.0'; preg_match($pattern,$ip,$out); print_r($out); $s=''; for($i=0;$i<32;$i++){ $s .= '1'; } echo $s; echo strlen($s);
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨書籍:
js の通常の実装番号は 4 桁ごとにスペースで区切られています PHP での正規表現の使用効率 貪欲、非貪欲、およびバックトラッキングの詳細な説明 (コード付き)
以上が通常のIPマッチングの詳細なグラフィックとテキストの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。