PHP は *NIX の一貫した伝統を継承しており、完全にサポートしています形式的な式の処理。正規表現は、高度ではありますが、直感的ではない文字列の照合と処理の方法を提供します。 PERL の正規表現を使用したことのある友人は、正規表現が非常に強力であることを知っていますが、習得するのは簡単ではありません。
例:
^.+@.+..+$
この有効ではあるが理解できないコードは、一部のプログラマー (私) を頭痛にさせるか、正規表現の使用を諦めさせるのに十分です。このチュートリアルを読み終えると、このコードの意味が理解できると思います。
基本パターンマッチング
すべては基本から始まります。パターンは正規表現の最も基本的な要素であり、文字列の特性を記述する文字のセットです。パターンは、通常の文字列で構成される単純な場合もあれば、文字範囲、繰り返し、コンテキストを表すために特殊文字を使用する非常に複雑な場合もあります。例:
^once
このパターンには特殊文字 ^ が含まれています。このパターンは、1 回 で始まる文字列にのみ一致することを意味します。たとえば、このパターンは文字列 「昔々」 および 「かつて ニューヨーク から来た男がいた」一致しません。 ^ などの記号が先頭を示すのと同様に、$ は、指定されたパターンで終わる文字列と一致します。
bucket$
このパターンは 「誰がこの現金をすべてバケツに入れていたのか」と同じです は一致しますが、"buckets" とは一致しません。文字 ^ と $ を一緒に使用すると、完全一致を表します (文字列はパターンと同じです)。例:
^bucket$
は文字列 "bucket" にのみ一致します。パターンに ^ と $ が含まれていない場合、そのパターンを含む任意の文字列と一致します。例: パターン
1 回
と文字列
かつて
出身の男がいた🎜>NewYork
現金をすべてバケツに入れていた
が一致します。
パターン内の文字 (o-n-c-e) はリテラル文字、つまり文字自体を表します。 、数字は同じです。句読点や白文字 (スペース、タブなど) など、その他の少し複雑な文字にはエスケープ シーケンスが必要です。すべてのエスケープ シーケンスはバックスラッシュ () で始まります。タブ文字のエスケープ シーケンスは、t
です。したがって、文字列がタブ文字で始まるかどうかを検出したい場合は、次のパターンを使用できます:
^t 同様に、以下を使用します。 n は、 " 改行 " 、r を意味します はキャリッジリターンを意味します。他の特殊記号は、前にバックスラッシュを付けて使用できます。たとえば、バックスラッシュ自体はピリオド で表されます。 は . などの意味です。
キャラクタークラスター
(インターネット プログラムでは、ユーザー入力を検証するために正規表現がよく使用されます。ユーザーが FORM を送信すると、入力された電話番号、住所、EMAIL アドレス、クレジット カード番号などが判断されます。は有効です。通常のリテラルベースの文字では不十分です。
したがって、必要なパターンを記述するために、より自由な方法、つまり文字クラスターを使用する必要があります。すべての母音を表すクラスターを作成するには、すべての母音を角かっこで囲みます:
[AaEeIiOoUu
]
このパターンは任意の母音文字と一致しますが、表すことができるのは 1 つの文字のみです。次のような文字の範囲を表すにはハイフンを使用します。
[a-z] // はすべての小文字に一致します
[ A-Z ] //すべての大文字と一致します
[a-zA-Z] //すべての文字と一致します
[0-9] // はすべての数字に一致します
[0-9.-] // はすべての数字、ピリオドに一致しますマイナス記号
[ frtn] // はすべての白色文字に一致します
繰り返しになりますが、これらは 1 つの文字を表しているだけであり、それは非常に重要です。 "z2"、"t6" など、1 つの小文字と 1 つの数字で構成される文字列を一致させたい場合は、 "g7" ただし、"ab2"、"r2d3" または"b52"、次のモードを使用します:
^[a-z][0-9]$
[a-z] は 26 文字の範囲を表しますが、ここでは文字が一致する最初の String のみと一致します。は小文字です。
^ は文字列の先頭を表すと前述しましたが、これには別の意味があります。一連の角括弧 ^ 内で使用すると、 「 ではありません 」 または 「 は を除外します」 は、特定の文字を削除するためによく使用されます。前の例を使用すると、最初の文字を数字にすることはできません:
^[^0-9][0-9]$
このモードは、"&5"、"g7"、および と同じです。 "-2 " は一致しますが、"12"、"66" とは一致しません。特定の文字を除外する例をいくつか示します。
[^a-z] //小文字を除くすべての文字
[^ /^] //()(/)(^)
を除くすべての文字[^ "'] // 二重引用符 (") と単一引用符 (') すべての文字 を除く
特殊文字 "." (ドット、ピリオド ) は"改行" を除くすべての文字を表す正規表現で使用されます。したがって、パターン "^.5$" は、数字 5 で終わり、その他の数字で終わる任意の 2 文字パターンと一致します。 "newline" 文字で始まる文字列と一致します。パターン "." は、空の文字列を除く任意の文字列に一致し、"改行 のみを含みます。 「 文字列。
PHP の正規表現にはいくつかの組み込みの共通文字クラスターがあり、リストは次のとおりです:
文字クラスタ 意味
[:alpha:] 任意の文字
[:digit:] 任意の数字
[:alnum:] 任意の文字と数字
[:space:] 任意の白文字
[:upper:] 任意の大文字
[: lower:] 任意の小文字
[:句読点:] 任意の句読点
[:xdigit:] 任意の 16 基数、[0-9a-fA - F]
重複を識別する
ここまでで、文字または数字を照合する方法はすでにわかりましたが、さらに多くのことを行うことができます。多くの場合、単語または一連の数字を一致させたい場合があります。単語は複数の文字で構成され、数字のグループは複数の単数で構成されます。文字または文字クラスターに続く中括弧 ({}) は、前のコンテンツが繰り返される回数を決定するために使用されます。
文字クラスター 意味
^[a-zA-Z_] $ すべての文字とアンダースコア
^[:alpha:]$ すべて 3 文字を含む単語
^a$ 文字 a
^a$ aaaa
^a$ aa、 aaa または aaaa
^a$ a,aa または aaa
^a$ には 2 つ以上の a が含まれています文字列
^a 例: ツチブタ および aaab ですが、リンゴ
ではありません 例: baad および aaa、でも ナンタケットいいえ
t 2 つのタブ
すべて。 2 文字
これらの例では、中括弧の 3 つの異なる使用法を説明します。 を意味する数字「 に先行する文字または文字クラスターは、x 回のみ出現します。」; 数字とカンマは、「 前のコンテンツが表示される回数 x またはそれ以上 "; "を示すカンマで区切られた 2 つの数字。前のコンテンツは少なくとも x 回出現する必要がありますただし、y 回 ” を超えてはなりません。パターンをさらに多くの単語や数字に拡張できます: ^[a-zA-Z0-9_]$ //
すべてに複数の文字、数字が含まれますまたはアンダースコア文字列
^[0-9]$ //すべての正の数
^-[0-9 ]$ //すべての整数
^-[0-9].[0-9]$ //すべての小数
最後の例は理解するのが簡単ではありませんね。このように見てください。オプションの負符号 (-)(^) で始まり、その後に 0 またはそれ以上の桁([0-9])、およびオプションの小数点(.) に 0 またはそれ以上の数字 ([0-9]) が続き、その他は何もありません($)。以下では、使用できるより簡単な方法について説明します。
特殊文字 "?" であり、両方とも次を表します: " 0 または 1 前のコンテンツ" または "前述の内容はオプションです ”。したがって、今の例は次のように簡略化できます:
^-?[0-9].?[0-9]$
特殊文字 "*" は >" と同じです。最後に、文字 "+" は と等価です。これは、" 1 以上を意味します。コンテンツ ” であるため、上記の 4 の例は次のように記述できます: ^ [ a-zA-Z0-9_]+$ //複数の文字、数字、またはアンダースコアを含むすべての文字列 ^[0-9]+$ //
すべての正の数 ^-?[0-9]+$ //すべての整数
^-?[0-9]*.?[0-9]*$ // すべての小数
もちろん、これにより技術的に正規表現の複雑さが軽減されるわけではありませんが、読みやすくなります.