PHP では、正規表現は文字の配置パターンを記述するカスタム文法規則であり、パターンを記述することができる非常に完全な文法システムを備えており、柔軟で直感的な文字列処理方法を提供します。正規表現は、文字列に特定の部分文字列が含まれているかどうかを確認したり、一致する部分文字列を置き換えたり、文字列から特定の条件を満たす部分文字列を抽出したりするために使用できる文字列一致パターンを記述します。
このチュートリアルの動作環境: Windows7 システム、PHP8 バージョン、DELL G3 コンピューター
正規表現については、大まかに聞いたことがあるかもしれません。習得するのが難しく、非常に複雑で、得体の知れない印象があります。実際、正規表現はそれほど神秘的なものではなく、文字の配置パターンを記述するカスタムの文法規則です。
正規表現とは何ですか?
正規表現はパターン式とも呼ばれ、記述することができる非常に完全なパターンのセットを持っています。 . 構文システムは、柔軟で直感的な文字列処理方法を提供します。正規表現は、特定のルールでパターンを構築し、入力文字列情報と比較し、特定の関数で使用して文字列の一致、検索、置換、セグメント化などの操作を実行します。
日常生活で例を挙げると、コンピュータ上の特定のディレクトリにあるすべての txt 形式のファイルを検索する場合、ディレクトリに *.txt と入力して Enter キーを押します。ディレクトリ内のすべての txt 形式のファイル。ここで使用されている *.txt は、単純な正規表現として理解できます。
次の 2 つの例は、次に示すように、正規表現の構文を使用して構築されています。
/http(s)?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is // 匹配网址 URL 的正则表达式 /^\w{3,}@([a-z]{2,7}|[0-9]{3})\.(com|cn)$/ // 匹配邮箱地址的正则表达式
上記の例の一見文字化けしているように見える文字列に惑わされないでください。これらは次のように表現されています。正規表現 通常の文字と特殊な機能を持つ文字で構成される文字列です。また、これらの文字列を有効にするには、特定の正規表現関数で使用する必要があります。
正規表現の目的
正規表現は、文字列に次のものが含まれているかどうかを確認するために使用できる文字列一致パターンを記述します。特定の部分文字列を抽出したり、一致する部分文字列を置換したり、文字列から特定の条件を満たす部分文字列を抽出したりすることができます。たとえば、ユーザーがフォームを送信するときに、入力された電話番号や電子メール アドレスなどが有効かどうかを判断するには、通常のリテラル ベースの文字検証では明らかに十分ではありません。
正規表現は、通常の文字 (文字 a ~ z など) と特殊文字 (「メタ文字」と呼ばれる) で構成されるリテラル パターンです。正規表現は、文字パターンと検索文字列を照合するテンプレートとして機能します。正規表現パターンは、単一の文字、文字のコレクション、文字の範囲、文字間の選択、またはこれらすべてのコンポーネントの任意の組み合わせにすることができます。
正規表現を使用する目的は、強力な機能を簡単な方法で実現することです。シンプル、効果的、強力にするために正規表現のルールは複雑になり、正しく効果的な正規表現を構築するのはさらに難しいため、ある程度の努力が必要です。開発を開始した後、特定のリファレンスと多くの練習を経て、開発実践で正規表現を使用することは非常に効果的で興味深いものであることがわかりました。
正規表現でよく使用される用語
正規表現を学ぶ前に、まずそのいくつかを理解しましょう。これは混同されやすい用語です。 , これは正規表現を学ぶのに非常に役立ちます。
1) grep
はもともと ED エディターのコマンドで、ファイル内の特定のコンテンツを表示するために使用されました。後にスタンドアロン ツール grep になりました。
2) egrep
grep は常に更新およびアップグレードされていますが、依然としてテクノロジーのペースに追いつくことができません。このため、ベル研究所は「拡張 grep」を意味する egrep を作成しました。これにより、正規表現の能力が大幅に強化されます。
3) POSIX (UNIX のポータブル オペレーティング システム インターフェイス)
ポータブル オペレーティング システム インターフェイス。 grep が進化するにつれて、他の開発者も独自の好みに基づいた独自のスタイルを備えた独自のバージョンを作成しました。しかし、問題も発生し、プログラムによっては特定のメタキャラクターがサポートされる場合と、サポートされない場合があります。したがって、POSIX。 POSIX は、オペレーティング システム間の移植性を保証する一連の標準です。ただし、POSIX は SQL と同様に最終標準にはなっていないため、参照としてのみ使用できます。
4) Perl (実用的な抽出およびレポート言語)
実用的な抽出およびレポート言語。 1987 年にラリー ウォールは Perl をリリースしました。 Perl1 から現在の Perl5 までの 7 年間で、最終的には POSIX に続く別の標準となりました。
5) PCRE
Perl の成功により、C/C、Java、Python などの他の開発者もある程度「Perl」と互換性を持ち、それらはすべて独自の正規表現を持っています。 1997 年に、Philip Hazel は、Perl 正規表現と互換性のある正規表現エンジンのセットである PCRE ライブラリを開発しました。他の開発者は、PCRE を独自の言語に統合して、ユーザーに豊富な正規表現機能を提供できます。 PCRE は、PHP を含む多くのソフトウェアで使用されています。
正規表現の構文ルール
正規表現を使用する前に、まず正規表現の構文を学習する必要があります。正規表現の構成要素には通常、通常の文字、メタ文字、修飾子、アンカー ポイント、非印刷文字、および指定された置換が含まれます。
1) 通常の文字
通常の文字には、メタキャラクターとして明示的に指定されていないすべての印刷可能文字と印刷不可能な文字が含まれます。これには、すべての大文字と小文字、数字、および文字が含まれます。句読点記号といくつかの記号。最も単純な正規表現は、検索文字列の比較に使用される単一の通常の文字です。たとえば、1 文字の正規表現 /A/ は常に文字 A と一致します。
複数の単一文字を組み合わせて長い表現を形成することもできます。たとえば、正規表現 /the/ は、検索文字列内の the、there、other および over の怠惰な犬に一致します。連結演算子を使用する必要はなく、文字を連続して入力するだけです。
2) メタキャラクター
通常の文字に加えて、正規表現には「メタキャラクター」を含めることもできます。メタキャラクターは、単一文字のメタキャラクターと複数文字のメタキャラクターに分類できます。たとえば、メタ文字 \d は数字と一致します。
すべての単一文字のメタキャラクターを次の表に示します。
メタキャラクター | 動作 | 例 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
一致直前の文字または部分式を 0 回以上、{0,} | zo* に相当します。「z」および「zoo」と一致します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
先行する文字または部分式に 1 回以上一致します。{1,} | zo は、「zo」と「zoo」に一致しますが、「z」には一致しません | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? | ? が他の修飾 (*、,?、{n}、{n,}、または { n,m})、一致パターンは貪欲ではありません。非貪欲パターンはできるだけ少ない文字列に一致しますが、デフォルトの貪欲パターンはできるだけ多くの文字列に一致します | zo? は "z" と "zo" に一致しますが、"zoo" には一致しません o ? 「oooo」内の単一の「o」のみに一致しますが、o はすべての「o」に一致します do(es)? 「do」または「does」に一致します 「do」は | ## に一致します|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
は検索文字列の先頭と一致します。 m (複数行検索) 文字がフラグに含まれている場合、^ は \n または \r の後の位置にも一致します。 ^ が括弧式の最初の文字として使用される場合、文字セットは反転されます。 | ^\d{3} は検索文字列の先頭から 3 文字に一致します。 | [^ abc] 任意の文字に一致します。 a、b、c を除く||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
検索文字列の末尾と一致します。 m (複数行検索) 文字がフラグに含まれている場合、^ は \n または \r の前の位置にも一致します。 | \d{3}$ は、検索文字列の末尾の 3 桁と一致します | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
改行文字以外のすべてと一致します \n任意の 1 文字。 \n を含む任意の文字と一致するには、[\s\S] | a.c のようなパターンを使用します。「abc」「a1c」および「a-c」 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
括弧式の開始と終了をマークします | [1-4] は、「1」、「2」、「3」、または「4」に一致します | [^aAeEiIoOuU]母音以外の文字と一致します||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
修飾子式の先頭と末尾をマークします | a {2,3} は「aa」と一致します" および "aaa" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
部分式の始まりと終わりをマークします。将来の使用のために部分式を次の場所に保存できます。 (\d) は「A0」から「A9」までに一致します。今後の使用のためにこの番号を保存してください | | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
z|「z 」または「food」が付いた食品 | (z|f)ood と一致します。 「zood」または「food」と一致します。##/ | JavaScript のテキスト正規表現を表します。パターンの先頭と末尾を表します。 。 2 番目の「/」の後に 1 文字のフラグを追加すると、検索動作が指定されます。 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
\ | 次のマークを付けます。文字 特殊文字、リテラル、後方参照、または 8 進エスケープ文字 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
に一致します |
メタキャラクター | 動作 | 例 |
---|---|---|
\b | 単語の境界マッチング。つまり、単語とスペースの間の位置 | er\b は、「never」の「er」と一致しますが、「動詞」の「er」とは一致しません。 | #\B
er\B は、「動詞」の「er」と一致しますが、「never」の「er」とは一致しません | \d | |
検索文字列「12 345」では、\d{2} は「12」に一致します。 「34」。 \d は、「1」、「2」、「3」、「4」、および「5」に一致します。 | \D | |
/D は、「abc123 def」の「abc」および「def」に一致します。 | \w | |
検索文字列「The Quick Brown fox...」の場合、\ w は「The」と一致します。 、「quick」、「brown」、および「fox」 | \W | |
検索文字列「The Quick Brown fox...」、\W と "..." およびすべてのスペース | # に一致します | #[xyz] |
[abc] のいずれかと一致し、「plain」の「a」と一致します | [^xyz] | |
[^abc] "plain" "p"、"1"、"i" と同じおよび "n" は、 | [a-z] | |
[a-z] 任意の小文字のアルファベットに一致します。 "a" から "z" の範囲の文字 | [^a-z] | |
[^a-z] 'a' ~ 'z' の範囲にない文字と一致します。 | {n} | |
#o{2} は、「Bob」の「o」には一致しませんが、「fooood」の両方の「o」に一致します | { n,} | |
に等しい、{1,}に等しい | o{2 } は、「Bob」の「o」には一致しませんが、「fooood」のすべての「o」に一致します | {n,m} |
と同等です。 , \d{ 1,3} は、「123」、「456」、および「7」に一致します。 | (パターン) | |
(章|セクション) [1-9] 「章 5」と一致します。将来使用するために「章」を保存します ## を使用します | #(?:pattern) | パターンに一致しますが、一致を保存しません。つまり、一致は将来の使用のために保存されません。これは、パターン部分と「or」文字 (|) |
(? と等しい) を組み合わせる場合に便利です。 =モード) | 肯定的な予測が最初になります。一致するものが見つかると、一致するテキストの前から次の一致の検索が開始されます。一致した内容は将来の使用のために保存されません。 | |
長さは 4 ~ 8 文字である必要があります。と の間には少なくとも 1 つの数字が含まれている必要があります。このパターンでは、*\d は数字が後に続く任意の数の文字を検索します。検索文字列 "abc3qr" の場合、"abc3" と一致します。 | この一致の前から , (代わりにof after) {4,8} で始まる 4 ~ 8 文字を含む文字列と一致し、「abc3qr」と一致します。^ と $ は検索文字列の開始位置と終了位置を指定し、検索文字列に一致文字||
#(?! pattern) | # 以外の文字が含まれている場合は一致を防ぎます。 ## 否定的な予測が最初に表示されます。パターンに一致しない検索文字列と一致します。一致するものが見つかると、一致するテキストの前から次の一致の検索が開始されます。将来の使用のために一致は保存されません。\b(?!th)/w \b は、「th」で始まらない単語に一致します。 このパターンでは、\b は単語の境界に一致します。検索文字列「quick」の場合、最初のスペースと一致します。 (?!th) は、「th」以外の文字列に一致します。 「qu」に一致します。その一致から開始します。 !w は、1 つの単語に一致します。つまり、「quick」に一致します。 | |
は、x で示される制御文字と一致します。 x の値は、A ~ Z または a ~ z の範囲内である必要があります。そうでない場合、c はリテラルの「c」文字自体であるとみなされます | \cM は Ctrl M またはキャリッジ リターン文字と一致します | |
N と一致します。n は 16 進数のエスケープ コードです。 16 進エスケープ コードの長さは正確に 2 桁である必要があります。正規表現では ASCII コードを使用できます | \x41 は「A」に一致し、\x41 は「\x04」の後に「1」が続くものと同等です (n は正確に 2 桁でなければならないため) | |
num と一致します。ここで、num は正の整数です。これは、 | (.)\1 で保存された一致への参照です。 2 つの連続する同一文字と一致します。 | |
は、8 進数のエスケープ コードを識別します。または後方参照。 \n の前に少なくとも n 個のキャプチャ部分式がある場合、n は後方参照です。それ以外の場合、n が 8 進数 (0 ~ 7) である場合、n は 8 進数のエスケープ コード | (\d) \ 1 連続する 2 つの同一の数字と一致します。 | |
は、8 進数のエスケープ コードまたは後方参照を識別します。 \nm の前に少なくとも nm のキャプチャ部分式がある場合、nm は後方参照です。 \nm の前に少なくとも n 個のキャプチャ部分式がある場合、n は後方参照であり、その後にテキスト m が続きます。上記の条件がいずれも存在しない場合、n と m が 8 進数 (0 ~ 7) の場合、\nm は 8 進数のエスケープ コードに一致します。 nm | \11 はタブ文字 | # に一致します。 |
n が 8 進数 (0 ~ 3)、m と 1 が 8 進数 (0 ~ 7) の場合、8 進数のエスケープ コード nml | \011 と一致します。タブ文字 | |
n と一致します。ここで、n は 4 桁の 10 進数で表される Unicode 文字です。記号 (©️) は |
非印刷文字は通常の文字とエスケープ文字で構成されます。正規表現の特定の動作に一致させるために使用される文字 (改行、フォーム フィード、空白文字など)。次の表に、印刷されない文字を示します。文字
## は
\f | Formfeed | と同等です。 | \x0c および \cL
---|---|---|
##\n | 改行 | \x0a および \cJ |
\r | キャリッジリターン | \x0dおよび\cM |
\s | スペース、タブを含む任意の空白文字、およびフォーム フィード | [\f\b\r\t\v] |
\S | 空白以外の文字 | [^\f\b\r\t\v] |
タブ文字 | \x09 および \cI | |
垂直タブ | \x0b および \cK | |
4 ) 優先順位 | 正規表現を使用する場合は、一致順序に注意する必要があります。通常、同じ優先度の操作は左から右に実行され、異なる優先度の操作は高から低に実行されます。次の表に示すように、さまざまな演算子のマッチング順序の優先順位は高いものから低いものまであります。 |
順序 メタ文字
説明
\ | エスケープ文字 | |
---|---|---|
( )、(?:)、(?=)、[ ] | 括弧と角括弧 | |
*、 、{n}、{n,}、{n,m} | 修飾子 | |
^,$,\ 任意のメタ文字 | アンカーとシーケンス | |
| ######交換する ############ |