ホームページ >バックエンド開発 >PHPチュートリアル >PHP正規表現アプリケーションの詳しい説明
PHP正規表現の使い方を詳しく解説
1.1 非印刷文字??
?
cx | 匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 |
f | 匹配一个换页符。等价于 x0c 和 cL。 |
n | 匹配一个换行符。等价于 x0a 和 cJ。 |
r | 匹配一个回车符。等价于 x0d 和 cM。 |
s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。 |
S | 匹配任何非空白字符。等价于 [^ fnrtv]。 |
t | 匹配一个制表符。等价于 x09 和 cI。 |
v | 匹配一个垂直制表符。等价于 x0b 和 cK。 |
?
1.2 特殊文字 ??
?
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘n’ 或 ‘r’。要匹配 $ 字符本身,请使用 $。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 n之外的任何单字符。要匹配 .,请使用 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。 |
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。 | |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 {。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 |。 |
?
1.3 予選
?
修飾子は、一致を満たすために正規表現の特定のコンポーネントが何回出現する必要があるかを指定するために使用されます。 * または + または ? または {n} または {n,} または {n,m} の 6 種類があります。
*、+、および ? 修飾子はすべて、できるだけ多くのリテラルと一致するため、それらの後に ? を追加するだけで非貪欲一致または最小限の一致が実現されます。
正規表現の修飾子は次のとおりです:
?
?
?
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
?
1.4 ロケーター
?
文字列または単語の境界を表すために使用されます。^ と $ はそれぞれ文字列の先頭と末尾を指し、b は単語の前または後ろの境界を表し、B は単語以外の境界を表します。 修飾子はロケーターでは使用できません。
1.5 を選択します
?
すべての選択を括弧で囲み、隣接する選択を | で区切ります。ただし、括弧を使用すると、関連する一致がキャッシュされるという副作用が生じます。この場合、最初のオプションの前に ?: を使用すると、この副作用を排除できます。
このうち、?: は非キャプチャー要素の 1 つで、他の 2 つの非キャプチャー要素は ?= と ?! です。これら 2 つは前方参照であり、一致を開始します。正規表現パターンは、正規表現パターンに一致しない任意の位置の検索文字列に一致します。後者は、正規表現パターンに一致しない任意の最初の位置にある検索文字列に一致します。
1.6 後方参照
?
正規表現パターンまたはパターンの一部を括弧で囲むと、関連する一致が一時バッファーに保存され、正規表現パターンで左から右に検出された各部分一致がキャプチャされます。 ストレージ。部分一致が格納されるバッファには、1 から始まり、最大 99 個の部分式まで連続した番号が付けられます。各バッファには「n」を使用してアクセスできます。n は 特定のバッファを識別する 1 桁または 2 桁の 10 進数。
非キャプチャメタ文字「?:」、「?=」、または「?!」を使用すると、関連する一致の保持を無視できます。
?
2. 各種演算子の演算優先順位
?
同じ優先度の操作は左から右に実行され、異なる優先度の操作は高から低に実行されます。さまざまな演算子の優先順位は高いものから低いものまで次のとおりです:
?
转义符 | |
(), (?:), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, anymetacharacter | 位置和顺序 |
| | “或”操作 |
?
3. すべての記号の説明
?
?
次の文字を特殊文字、リテラル文字、後方参照、または 8 進エスケープ文字としてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字に一致します。シーケンス「\」は「」に一致し、「(」は「(」に一致します。 | |
^ | 入力文字列の先頭と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、^ は 'n' または 'r' の後の位置にも一致します。 |
$ | 入力文字列の終了位置と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は 'n' または 'r' の前の位置にも一致します。 |
* | 直前の部分式と 0 回以上一致します。たとえば、zo* は「z」と「zoo」に一致します。 * {0,} に相当します。 |
+ | 前述の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」には一致しますが、「z」には一致しません。 + は {1,} と同等です。 |
? | 直前の部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「do」または「does」の「do」と一致します。 ? {0,1} に相当します。 |
{n} | n は負ではない整数です。特定の回数 n 回一致します。たとえば、「o{2}」は「Bob」の「o」と一致できませんが、「food」の 2 つの o と一致します。 |
{n,} | n は負ではない整数です。少なくとも n 回一致します。たとえば、「o{2,}」は「Bob」の「o」とは一致しませんが、「foooood」のすべての「o」には一致します。 「o{1,}」は「o+」と同等です。 「o{0,}」は「o*」と同等です。 |
{n,m} | M と n は両方とも非負の整数であり、n |
? | この文字の直後に他のリミッターが続く場合 (*, +、?、{n}、{n,}、{n,m}) その後、一致するパターンは貪欲ではなくなります。非貪欲モードは検索文字列の可能な限り少ない部分と一致しますが、デフォルトの貪欲モードは検索文字列の可能な限り多くの部分と一致します。たとえば、文字列の場合、 「oooo」、「o+?」は 1 つの「o」に一致し、「o+」はすべての「o」に一致します。 |
. | 「n」を除く任意の 1 文字と一致します。 「n」を含む任意の文字と一致するには、「[.n]」のようなパターンを使用します。 |
(パターン) | パターンを一致させて、この一致を取得します。取得された一致は、VBScript の SubMatches コレクションまたは JScript の $0 ~ $9 プロパティを使用して、生成された Matches コレクションから取得できます。括弧文字と一致させるには、「(」または「)」を使用します。 |
(?:パターン) | パターンの一致 ただし、照合結果は取得されません。これは、これは非取得照合であり、後で使用するために保存されないことを意味します。これは、「または」文字 (|) を使用してパターンの一部を結合する場合に便利です。例えば、 「industr(?:y|ies)」は「industry|industries」よりも単純な式です。 |
(?=パターン) | 任意の一致パターンでの前方参照 検索文字列の先頭と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows」 (?=95|98|NT|2000)' は、「Windows 2000」の「Windows」には一致しますが、「Windows 3.1」には一致しません。 で 「ウィンドウズ」。プリフェッチでは文字は消費されません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。 |
(?!パターン) | パターンが一致しない場合の否定的な検索 検索文字列の先頭と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows」 (?!95|98|NT|2000)' は、「Windows 3.1」の「Windows」には一致しますが、「Windows 2000」には一致しません。 の「Windows」。プリフェッチは文字を消費しません。つまり、一致が発生した後、次の一致の検索は、プリフェッチ | を含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。
x|y | x または y と一致します。たとえば、「z|food」は「z」または「food」と一致します。 '(z|f)ood' は、「zood」または「food」と一致します。 |
[xyz] | キャラクターコレクション。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。 |
[^xyz] | 負の値の文字のコレクション。含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」の「p」と一致します。 |
[a-z] | 文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[a-z]」は、「a」から「z」の範囲内の任意の小文字の英字と一致します。 |
[^a-z] | 負の文字範囲。指定された範囲内にない任意の文字と一致します。たとえば、「[^a-z]」は、「a」から「z」の範囲にない任意の文字と一致します。 |
b | 単語とスペースの間の位置を指す単語境界と一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。 |
B | 単語以外の境界と一致します。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。 |
cx | x で指定された制御文字と一致します。たとえば、cM は Control-M または復帰文字と一致します。 x の値は、A ~ Z または a ~ z のいずれかでなければなりません。それ以外の場合、c はリテラルの「c」文字として扱われます。 |
d | 数字と一致します。 [0-9]に相当します。 |
D | 数字以外の文字と一致します。 [^0-9] と同等。 |
f | はフォーム フィードに一致します。 x0c および cL に相当します。 |
ん | は改行文字と一致します。 x0a および cJ に相当します。 |
r | は復帰文字と一致します。 x0d および cM に相当します。 |
さん | スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。 |
S | は空白以外の任意の文字に一致します。 [^ fnrtv] に相当します。 |
t | はタブ文字と一致します。 x09 および cI に相当します。 |
v | 垂直タブ文字と一致します。 x0b および cK に相当します。 |
わ | アンダースコアを含む任意の単語文字と一致します。 「[A-Za-z0-9_]」と同等。 |
W | 単語以外の文字と一致します。 「[^A-Za-z0-9_]」と同等。 |
xn | n に一致します。n は 16 進数のエスケープ値です。 16 進数のエスケープ値は、正確に 2 桁の長さである必要があります。たとえば、「x41」は「A」と一致します。「x041」は「x04」および「1」と同等です。 ASCII エンコーディングは正規表現で使用できます。 . |
番号 | num と一致します。ここで、num は正の整数です。取得した一致への参照。たとえば、「(.)1」は、連続する 2 つの同一の文字に一致します。 |
ん | 8 進エスケープ値または後方参照を識別します。 n の前に少なくとも n 個のフェッチされた部分式がある場合、n は後方参照になります。それ以外の場合、n が 8 進数 (0 ~ 7) の場合、n は 8 進数のエスケープ値になります。 |
んん | 8 進エスケープ値または後方参照を識別します。もし nm の前に少なくとも nm 個の取得可能な部分式がある場合、nm は後方参照になります。 nm の前に少なくとも n が得られる場合、n はリテラルの m で、その後に m が続きます。 後方参照の。前述の条件がどちらも当てはまらず、n と m が両方とも 8 進数 (0 ~ 7) である場合、nm は 8 進数のエスケープ値 nm と一致します。 |
nml | n が 8 進数 (0 ~ 3) で、m と l が両方とも 8 進数 (0 ~ 7) の場合、8 進数のエスケープ値 nml と一致します。 |
アン | n と一致します。n は 4 桁の 16 進数で表される Unicode 文字です。たとえば、u00A9 は著作権記号 (?) に一致します。 |
4. いくつかの例
?
?
/b([a-z]+) 1b/gi | 一个单词连续出现的位置 |
/(w+)://([^/:]+)(:d*)?([^# ]*)/ | 将一个URL解析为协议、域、端口及相对路径 |
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ | 定位章节的位置 |
/[-a-z]/ | A至z共26个字母再加一个-号。 |
/terb/ | 可匹配chapter,而不能terminal |
/Bapt/ | 可匹配chapter,而不能aptitude |
/Windows(?=95 |98 |NT )/ | 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次 |
?
5. 正規表現一致ルール
5.1 基本的なパターンマッチング
?
すべては基礎から始まります。パターンは正規表現の最も基本的な要素であり、文字列の特性を記述する文字のセットです。パターンは、通常の文字列で構成される単純な場合もあれば、文字範囲、繰り返し、コンテキストを表すために特殊文字を使用する非常に複雑な場合もあります。例:
^1回
このパターンには特殊文字 ^ が含まれています。これは、パターンが 1 回で始まる文字列にのみ一致することを意味します。たとえば、このパターンは文字列「once」に関連付けられています。 「かつて」は「かつて、ある男がいた」と一致します。 NewYork" は一致しません。^ 記号が先頭を示すのと同じように、$ 記号は、指定されたパターンで終わる文字列と一致するために使用されます。
バケット$
このパターンは、「誰がこの現金をすべてバケツに入れたか」には一致しますが、「バケツ」には一致しません。文字 ^ と $ を一緒に使用すると、完全一致を表します (文字列はパターンと同じです)。例:
^バケット$
文字列「bucket」のみに一致します。パターンに ^ と $ が含まれていない場合は、そのパターンを含む任意の文字列と一致します。例: パターン
1 回
と文字列
かつてニューヨークから来た男がいました
現金をすべてバケツに入れていたのは誰ですか。
が一致します。
このパターンの文字 (o-n-c-e) はリテラル文字です。つまり、数字と同様に文字自体を表します。句読点や白文字(スペース、 タブ文字など)、エスケープ シーケンスを使用します。すべてのエスケープ シーケンスはバックスラッシュ () で始まります。タブ文字のエスケープ シーケンスは次のとおりです。したがって、文字列がタブ文字で始まるかどうかを検出したい場合は、これを使用できます パターン:
^t
同様に、「改行」を表すには n を使用し、復帰を表すには r を使用します。他の特殊記号は、前にバックスラッシュを付けて使用できます。たとえば、バックスラッシュ自体は \ で表され、ピリオドは . で表されます。
5.2 文字クラスタ
?
インターネット プログラムでは、通常、ユーザー入力を検証するために正規表現が使用されます。ユーザーがフォームを送信するとき、入力された電話番号、住所、電子メール アドレス、クレジット カード番号などが有効かどうかを判断するには、通常のリテラル文字を使用するだけでは十分ではありません。
したがって、必要なパターンを記述するために、より自由な方法、つまり文字クラスターを使用する必要があります。すべての母音文字を表すクラスターを作成するには、すべての母音文字を角括弧で囲みます:
[ああええええええ]
このパターンは任意の母音文字に一致しますが、表すことができるのは 1 つの文字のみです。
などの文字範囲を表すにはハイフンを使用します。 [a-z] //すべての小文字と一致します
[A-Z] //すべての大文字と一致します
[a-zA-Z] // すべての文字と一致します
[0-9] // すべての数字と一致します
[0-9.-] //すべての数字、ピリオド、マイナス記号と一致します
[ frtn ] // すべての白い文字と一致します
繰り返しますが、これらは非常に重要な 1 つの文字を表しているだけです。 「z2」、「t6」、「g7」などの小文字と数字で構成される文字列と一致するが、「ab2」、「r2d3」、「b52」とは一致しない場合は、次のパターンを使用します:
^[a-z][0-9]$
[a-z] は 26 文字の範囲を表しますが、ここでは最初の文字が小文字である文字列のみと一致します。
^ は文字列の先頭を表すと前述しましたが、別の意味もあります。 ^ が一連の角括弧内で使用される場合、それは「しない」または「除外する」を意味し、特定の文字を削除するためによく使用されます。前の例を使用すると、最初の文字を数字にすることはできません:
^[^0-9][0-9]$
このパターンは、「&5」、「g7」、および「-2」には一致しますが、「12」および「66」には一致しません。特定の文字を除外する例をいくつか示します:
[^a-z] //小文字を除くすべての文字
[^\/^] //()(/)(^) を除くすべての文字
[^”’] //二重引用符 (”) と一重引用符 (') を除くすべての文字
特殊文字「.」(ドット、ピリオド)は、「改行」を除くすべての文字を表すために正規表現で使用されます。したがって、パターン「^.5$」は、数字の 5 で終わり、「改行」以外の他の文字で始まる任意の 2 文字の文字列と一致します。パターン「.」は、空の文字列と「改行」のみを含む文字列を除く、任意の文字列と一致します。
PHP の正規表現にはいくつかの組み込みの共通文字クラスターがあり、そのリストは次のとおりです:
を意味する文字クラスター
[[:alpha:]] 任意の文字
[[:digit:]] 任意の数値
[[:alnum:]] 任意の文字と数字
[[:space:]] 任意の白文字
[[:upper:]] 任意の大文字
[[: lower:]] 任意の小文字
[[:punct:]] 任意の句読点
[[:xdigit:]] [0-9a-fA-F] に相当する任意の 16 進数
5.3 再発の判定
?
ここまでで、文字または数字を照合する方法をすでに理解しましたが、多くの場合、単語または数字のグループを照合したい場合があります。単語は複数の文字で構成され、数字のグループは複数の単数で構成されます。文字または文字クラスターに続く中括弧 ({}) は、前のコンテンツが繰り返される回数を決定するために使用されます。
を意味する文字クラスター
^[a-zA-Z_]$ すべての文字とアンダースコア
^[[:alpha:]]{3}$ すべての 3 文字の単語
^a$ 文字 a
^a{4}$ aaaa
^a{2,4}$ aa、aaa または aaaa
^a{1,3}$ a,aa または aaa
^a{2,}$ 2 つ以上の a を含む文字列
^a{2,} 例: ツチブタと aaab (ただし、apple は除く)
a{2,} 例: baad および aaa (ただし、Nantucket は除く)
t{2} 2 つのタブ文字
.{2} 2 文字すべて
これらの例では、中括弧の 3 つの異なる使用法を説明します。数値 {x} は、「前の文字または文字クラスターが x 回のみ出現する」ことを意味し、数値にカンマを加えたもの、{x,} は「前のコンテンツが出現する」ことを意味します。 x 回以上」; カンマで区切られた 2 つの数字、{x,y} は、「前のコンテンツが少なくとも x 回、ただし y 回以上出現しない」ことを意味します。パターンをさらに多くの単語または数字に拡張できます:
^[a-zA-Z0-9_]{1,}$ //複数の文字、数字、またはアンダースコアを含むすべての文字列
^[0-9]{1,}$ //すべての正の数
^-{0,1}[0-9]{1,}$ //すべての整数
^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ //すべて 10 進数
最後の例は理解するのが簡単ではありませんね。このように見てください。オプションの負符号 (-{0,1}) (^) で始まり、その後に 0 個以上の数字 ([0-9]{0,})、そしてオプションの 選択した小数点 (.{0,1}) に 0 個以上の数字 ([0-9]{0,}) が続き、それ以外は何もありません ($)。以下では、使用できるより簡単な方法について説明します。
特殊文字「?」は {0,1} に相当し、両方とも「0 または 1 個前のコンテンツ」または「前のコンテンツはオプション」を表します。したがって、今の例は次のように簡略化できます:
^-?[0-9]{0,}.?[0-9]{0,}$
特殊文字「*」は {0,} に等しく、両方とも「0 個以上前のコンテンツ」を表します。最後に、文字「+」は {1,} に等しく、これは「1 つ以上の前のコンテンツ」を意味するため、上記の 4 つの例は次のように書くことができます:
^[a-zA-Z0-9_]+$ //複数の文字、数字、またはアンダースコアを含むすべての文字列
^[0-9]+$ //すべての正の数
^-?[0-9]+$ //すべての整数
^-?[0-9]*.?[0-9]*$ //すべて 10 進数
もちろん、これによって技術的に正規表現の複雑さが軽減されるわけではありませんが、正規表現が読みやすくなります。