ホームページ > バックエンド開発 > PHPチュートリアル > PHP実践正規表現(1):携帯電話番号の検証

PHP実践正規表現(1):携帯電話番号の検証

WBOY
リリース: 2016-06-20 12:49:23
オリジナル
1532 人が閲覧しました

この記事では、携帯電話番号の概念を検証するための正規表現を段階的に改良することにより、正規表現における文字グループ、量指定子、文字列の開始/終了位置、グループ化、グループ化における選択構造、後方参照、名前付きグループ化について紹介します。

1 基本的な検証

それは、文字列が 11 桁の数字であるかどうかを検証することです。

  • [0123456789]{11}

  • または [0-9]{11}

  • または d{11}

知識ポイント

キャラクター グループ: 通常の正方形括弧 [...] は文字グループを表す式で使用されます。文字グループは、同じ位置に出現する可能性のある文字を表します。
たとえば、[0123456789] は数字 0123456789 のいずれかと一致することを意味し、[0123abc] は数字 0123 および文字 abc のいずれかと一致することを意味します。

文字グループの範囲表現: 文字グループでダッシュ ([..-..]) を使用して、文字の範囲を表します。
たとえば、[a-z] はすべての小文字の英文字のいずれか 1 つと一致することを意味し、[a-zA-Z] はすべての英小文字のいずれか 1 つと一致することを意味し、[0-9] は 0123456789 のいずれか 1 つと一致することを意味します。 。
なお、デフォルトの範囲は開始文字の ACSⅡコードと終了文字の ACSⅡコード の間の文字です。

文字グループの省略形: 一般的に使用される一部の文字グループについては、正規表現でそれらを表すための省略記号が提供されます。

  • d すべての数字、つまり [0-9]

  • D すべての非数字、d と相互に排他的です

  • w すべての単語文字 (文字、数字、アンダースコア)、つまり [0-9a-zA-Z_]

  • W すべての非単語文字、および W相互に排他的

  • s スペース、タブ、復帰、改行、その他の空白文字を含むすべての空白文字

  • S 空白以外のすべて文字は

数量子と相互に排他的です。 数量子は、変更されるオブジェクト (文字や文字グループなど) が出現する回数を示します。
量指定子の一般的な形式は {m,n} (コンマ、その後にスペースはありません) です。これは、修飾対象の文字 (または文字グループ) が m 回以上出現し、それ以下であることを意味します。 n回。特に、

  • {m} は、変更されたオブジェクトが m 回のみ出現できることを意味します。オブジェクトは最大で n 回出現でき、少なくとも 0 回出現します。

  • {m,} は、変更されたオブジェクトが少なくとも m 回出現することを意味します。

  • 2 長さは本当に 11 しかありませんか?

    以下の gif のコードを観察すると、入力文字列が長さ 15 の数値の場合、最初の 11 個の数値とも一致することがわかります。入力文字がabcd180123412341234の場合でも、11個の数字が一致します。

  • これは、上記の正規表現の意味が「11 個の数字に一致する」であるため、入力文字列

連続する 11 個の数字

が存在する限り、

とすることができます。無事マッチングしました。入力文字列が携帯電話番号のみであることを確認するには、正規表現で文字列の開始位置 ^ と終了位置 $ を使用する必要があります。

^d{11}$

  • 知識point

正規表現には、テキストではなく位置に一致する記号がいくつかあります。このタイプの記号は、

アンカー

(アンカー) と呼ばれます。 ^ と $ はそのうちの 2 つです。

^ 一致する位置は文字列の開始位置です $ 一致する位置は文字列の終了位置です 3 より厳密な検証

国内の一般的な携帯電話番号は誰もが知っています。 130-139、150-153、155-159、180、182、185-189を筆頭に、170、176-178などもあります。前のセクションで得られた式は、携帯電話の初期には検証されていませんでした。


^1(3[0-9]|5[012356789]|8[0256789]|7[0678])d{8}$

知識ポイント

グループ:

正規表現では、括弧のペア (...) を使用してグループ (部分式) を表すことができます。 result 一致したすべてのコンテンツを返すだけでなく、各部分式の一致したコンテンツも返します。上の図に示すように、式が実行された後の結果は、配列の 0 番目の要素が正規表現全体と一致する値であり、最初の要素が括弧のペア内の正規表現と一致する値です。

選択構造:

括弧内の部分式 (...) は、さまざまな選択肢を表すために縦棒で区切られています。括弧内の正規表現全体は、任意の選択肢に一致します。 。
preg_match('/^1(3[0-9]|5[012356789]|8[0256789]|7[0678])\d{8}$/', '18012341234', $arr);print_r($arr);/*Array(    [0] => 18012341234    [1] => 80)*/
ログイン後にコピー
たとえば、(3[0-9]|5[012356789]|8[0256789]|7[0678]) は、ここで一致する値が 3[0-9]、5[012356789]、または 8 である可能性があることを意味します[0256789] または 7[0678] のいずれか。

4 おまけ 携帯電話番号の真ん中に - 記号があり、たとえば、現在の iPhone では携帯電話番号が自動的に 180-1234-1234 に変換されます。このフォーマット。
これまでに紹介した知識の一部に基づいて、次の正規表現は 180-1234-1234 の形式と互換性があるように作成できます。

^1(3[0-9 ]|5 [012356789]|8[0256789]|7[0678])-{0,1}d{4}-{0,1}d{4}$

ここで -{0,1 } は文字を表します。これは以前に学習した量指定子です。実際、正規表現では、この

一般的な量指定子

には特別な表記法があります。

? {0,1} に相当し、0 回または 1 回出現する可能性があります

  • + は {1,} と同等、出現回数は 1 回以上

  • * は {0,} と同等、出現回数は 0 回以上です

  • したがって、上記の正規表現は

    ^1(3[0-9] |5[012356789]|8[0256789]|7[ 0678])-?d{4}-?d{4}$

    ただし、18012341234 と 180 の一致に加えて-1234-1234、上記の式は 180 にも一致します。 -12341234 と 1801234-1234 の 2 つの形式があります。
    2 つの形式 18012341234 と 180-1234-1234 のみを照合したい場合は、正規表現で 後方参照を使用できます:

    ^1(3[0- 9 ]|5[012356789]|8[0256789]|7[0678])(-?)d{4}2d{4}$

    上記の 2 は後方参照であり、2 番目に一致します。かっこ (...) のペアで一致するコンテンツ。後方参照の形式は num で、正規表現内の前のグループと一致するコンテンツを参照します。

    上記の正規表現では、後方参照に 2 を使用していますが、1 は役に立たないため、使用されていないグループは無視してもよいでしょうか?正規表現内の 非キャプチャ グループ は、この要件を満たすことができます:

    ^1(?:3[0-9]|5[012356789]|8[0256789]|7[ 0678 ])(-?)d{4}1d{4}$

    上記の (?:3[0-9]|5[012356789]|8[0256789]|7[0678]) はキャプチャグループではありません。非キャプチャ形式は (?:...) です。非キャプチャ グループ化を使用すると、一致する結果には、このグループ化によって一致する結果が含まれなくなります。

    上記のグループ化の参照は、部分式の数に基づいています。正規表現が複雑な場合、または数値が多すぎる場合、各グループ化の数を把握するのは面倒です。したがって、正規表現は という名前のグループ化 を提供します。

    ^1(?:3[0-9]|5[012356789]|8[0256789]|7[0678])(上記の正規表現の ?P-?)d{4}(?P=separato)d{4}$

    (?P-?) は名前付きグループ化です。名前付きグループの形式は (?P...) で、名前付きグループの参照には (?P=name) の形式が使用されます。

    5 概要

    この時点で、携帯電話番号を検証するための堅牢な正規表現が完成しました。この関数は非常に単純ですが、それでも正規表現に関する多くの知識が必要です。

    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート