PHPの正規表現ってどういう意味ですか?

青灯夜游
リリース: 2023-03-17 21:44:02
オリジナル
4280 人が閲覧しました

PHP では、正規表現は文字の配置パターンを記述するカスタム文法規則であり、パターンを記述することができる非常に完全な文法システムを備えており、柔軟で直感的な文字列処理方法を提供します。正規表現は、文字列に特定の部分文字列が含まれているかどうかを確認したり、一致する部分文字列を置き換えたり、文字列から特定の条件を満たす部分文字列を抽出したりするために使用できる文字列一致パターンを記述します。

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 は数字と一致します。

すべての単一文字のメタキャラクターを次の表に示します。

zo? は "z" と "zo" に一致しますが、"zoo" には一致しません ## に一致します##^[^ abc] 任意の文字に一致します。 a、b、c を除く $.[ ][^aAeEiIoOuU]母音以外の文字と一致します{}()2 つ以上の品目からの選択を示します(z|f)ood と一致します。 「zood」または「food」と一致します。 JavaScript のテキスト正規表現を表します。パターンの先頭と末尾を表します。 。 2 番目の「/」の後に 1 文字のフラグを追加すると、検索動作が指定されます。 /abc/gi は、「abc」に一致する JavaScript テキストの正規表現です。 g (グローバル) フラグは、パターンのすべての出現を検索するように指定します。i (大文字と小文字を区別しない) フラグは、大文字と小文字を区別しない検索を行います。 \ 次のマークを付けます。文字 特殊文字、リテラル、後方参照、または 8 進エスケープ文字 \n を改行文字と照合します。 \( は "(" に一致します。 \\ は "\" に一致します

これらの特殊文字は、括弧式内に出現すると意味を失い、通常の文字になります。これらの特殊文字と一致させるには、まず文字の前にバックスラッシュ \ を付けて文字をエスケープする必要があります。たとえば、テキスト文字を検索するには、式 \ を使用します。

上記の単一文字のメタキャラクターに加えて、次の表に示すように、複数文字のメタキャラクターもいくつかあります。

メタキャラクター動作
一致直前の文字または部分式を 0 回以上、{0,}zo* に相当します。「z」および「zoo」と一致します。
先行する文字または部分式に 1 回以上一致します。{1,}zo は、「zo」と「zoo」に一致しますが、「z」には一致しません
?? が他の修飾 (*、,?、{n}、{n,}、または { n,m})、一致パターンは貪欲ではありません。非貪欲パターンはできるだけ少ない文字列に一致しますが、デフォルトの貪欲パターンはできるだけ多くの文字列に一致します
o ? 「oooo」内の単一の「o」のみに一致しますが、o はすべての「o」に一致します
do(es)? 「do」または「does」に一致します 「do」は
は検索文字列の先頭と一致します。 m (複数行検索) 文字がフラグに含まれている場合、^ は \n または \r の後の位置にも一致します。 ^ が括弧式の最初の文字として使用される場合、文字セットは反転されます。^\d{3} は検索文字列の先頭から 3 文字に一致します。
検索文字列の末尾と一致します。 m (複数行検索) 文字がフラグに含まれている場合、^ は \n または \r の前の位置にも一致します。 \d{3}$ は、検索文字列の末尾の 3 桁と一致します
改行文字以外のすべてと一致します \n任意の 1 文字。 \n を含む任意の文字と一致するには、[\s\S]a.c のようなパターンを使用します。「abc」「a1c」および「a-c」
括弧式の開始と終了をマークします [1-4] は、「1」、「2」、「3」、または「4」に一致します
修飾子式の先頭と末尾をマークしますa {2,3} は「aa」と一致します" および "aaa"
部分式の始まりと終わりをマークします。将来の使用のために部分式を次の場所に保存できます。 (\d) は「A0」から「A9」までに一致します。今後の使用のためにこの番号を保存してください|
z|「z 」または「food」が付いた食品##/
#\B非境界単語一致er\B は、「動詞」の「er」と一致しますが、「never」の「er」とは一致しません\d数値文字の一致。[0-9] 検索文字列「12 345」では、\d{2} は「12」に一致します。 「34」。 \d は、「1」、「2」、「3」、「4」、および「5」に一致します。 \D 数字以外の文字に一致します。[ と同等です。 ^0-9]/D は、「abc123 def」の「abc」および「def」に一致します。\wmatches 任意の文字に一致しますA ~ Z、a ~ z、0 ~ 9、およびアンダースコアで表示されます。これは [A-Za-z0-9] 検索文字列「The Quick Brown fox...」の場合、\ w は「The」と一致します。 、「quick」、「brown」、および「fox」 \W A-Z、a-z、0-9、およびアンダースコアを除く任意の文字と一致 [ と同等^A-Za-z0-9]検索文字列「The Quick Brown fox...」、\W と "..." およびすべてのスペース # に一致します 文字セット。指定された文字 文字セットを逆にし、指定されていない任意の文字に一致します 文字範囲に一致し、指定された範囲内の任意の文字に一致します。指定された範囲にない任意の文字と一致する逆の文字範囲n 回正確に一致します。n は a です。負でない整数 少なくとも n 回一致します。n は負ではない整数です*{0,}少なくとも n 回一致します最大でも m 回です。 n と m は非負の整数であり、n<= m の場合、カンマと数値 ? の間にスペースを入れることはできません。検索文字列「1234567」の {0,1} と同等です。 , \d{ 1,3} は、「123」、「456」、および「7」に一致します。 パターンに一致し、一致を保存します。保存された一致は、JavaScript の exec メソッドによって返される配列要素から取得できます。括弧文字 () と一致させるには、「\(」または「\)」を使用します。 #(?:pattern) パターンに一致しますが、一致を保存しません。つまり、一致は将来の使用のために保存されません。これは、パターン部分と「or」文字 (|)industry(?:y|ies) がindustries|industries(? と等しい) を組み合わせる場合に便利です。 =モード)肯定的な予測が最初になります。一致するものが見つかると、一致するテキストの前から次の一致の検索が開始されます。一致した内容は将来の使用のために保存されません。^(?=_.*\d.{4,8}$ パスワードには次の制限を適用します。この一致の前から , (代わりにof after) {4,8} で始まる 4 ~ 8 文字を含む文字列と一致し、「abc3qr」と一致します。^ と $ は検索文字列の開始位置と終了位置を指定し、検索文字列に一致文字 # 以外の文字が含まれている場合は一致を防ぎます。 ## 否定的な予測が最初に表示されます。パターンに一致しない検索文字列と一致します。一致するものが見つかると、一致するテキストの前から次の一致の検索が開始されます。将来の使用のために一致は保存されません。\b(?!th)/w \b は、「th」で始まらない単語に一致します。 このパターンでは、\b は単語の境界に一致します。検索文字列「quick」の場合、最初のスペースと一致します。 (?!th) は、「th」以外の文字列に一致します。 「qu」に一致します。その一致から開始します。 !w は、1 つの単語に一致します。つまり、「quick」に一致します。 \cx は、x で示される制御文字と一致します。 x の値は、A ~ Z または a ~ z の範囲内である必要があります。そうでない場合、c はリテラルの「c」文字自体であるとみなされます\cM は Ctrl M またはキャリッジ リターン文字と一致します\xnN と一致します。n は 16 進数のエスケープ コードです。 16 進エスケープ コードの長さは正確に 2 桁である必要があります。正規表現では ASCII コードを使用できます\x41 は「A」に一致し、\x41 は「\x04」の後に「1」が続くものと同等です (n は正確に 2 桁でなければならないため)\num num と一致します。ここで、num は正の整数です。これは、(.)\1 で保存された一致への参照です。 2 つの連続する同一文字と一致します。 \n は、8 進数のエスケープ コードを識別します。または後方参照。 \n の前に少なくとも n 個のキャプチャ部分式がある場合、n は後方参照です。それ以外の場合、n が 8 進数 (0 ~ 7) である場合、n は 8 進数のエスケープ コード (\d) \ 1 連続する 2 つの同一の数字と一致します。 \nm は、8 進数のエスケープ コードまたは後方参照を識別します。 \nm の前に少なくとも nm のキャプチャ部分式がある場合、nm は後方参照です。 \nm の前に少なくとも n 個のキャプチャ部分式がある場合、n は後方参照であり、その後にテキスト m が続きます。上記の条件がいずれも存在しない場合、n と m が 8 進数 (0 ~ 7) の場合、\nm は 8 進数のエスケープ コードに一致します。 nm\11 はタブ文字 # に一致します。 \nml\un3 に一致します。3) 非印刷文字
メタキャラクター動作
\b単語の境界マッチング。つまり、単語とスペースの間の位置 er\b は、「never」の「er」と一致しますが、「動詞」の「er」とは一致しません。
#[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}

(パターン)
(章|セクション) [1-9] 「章 5」と一致します。将来使用するために「章」を保存します ## を使用します
長さは 4 ~ 8 文字である必要があります。と の間には少なくとも 1 つの数字が含まれている必要があります。このパターンでは、*\d は数字が後に続く任意の数の文字を検索します。検索文字列 "abc3qr" の場合、"abc3" と一致します。
#(?! pattern)
n が 8 進数 (0 ~ 3)、m と 1 が 8 進数 (0 ~ 7) の場合、8 進数のエスケープ コード nml\011 と一致します。タブ文字
n と一致します。ここで、n は 4 桁の 10 進数で表される Unicode 文字です。記号 (©️) は

非印刷文字は通常の文字とエスケープ文字で構成されます。正規表現の特定の動作に一致させるために使用される文字 (改行、フォーム フィード、空白文字など)。次の表に、印刷されない文字を示します。文字

## は

に一致し、\fFormfeed\x0c および \cL##\tタブ文字\x09 および \cI\v垂直タブ \x0b および \cK4 ) 優先順位
と同等です。
##\n改行\x0a および \cJ
\rキャリッジリターン\x0dおよび\cM
\sスペース、タブを含む任意の空白文字、およびフォーム フィード[\f\b\r\t\v]
\S空白以外の文字 [^\f\b\r\t\v]
正規表現を使用する場合は、一致順序に注意する必要があります。通常、同じ優先度の操作は左から右に実行され、異なる優先度の操作は高から低に実行されます。次の表に示すように、さまざまな演算子のマッチング順序の優先順位は高いものから低いものまであります。

順序 メタ文字

説明

1 \ エスケープ文字2( )、(?:)、(?=)、[ ] 括弧と角括弧3*、 、{n}、{n,}、{n,m}修飾子4^,$,\ 任意のメタ文字アンカーとシーケンス5| ######交換する ############

另外,字符具有高于替换运算符的优先级,例如,允许 "m|food" 匹配 "m" 或 "food"。

替换

正则表达式中的替换允许对两个或多个替换选项之间的选择进行分组。实际上可以在模式中指定两种匹配模式的或关系。可以使用管道|字符指定两个或多个替换选项之间的选择,称之为“替换”。匹配管道字符任一侧最大的表达式。

例如:

/Chapter|Section [1-9][0-9]{0,1}/
ログイン後にコピー

该正则表达式匹配的是字符串“Chapter”或者字符串“Section”后跟一个或两个数字。

如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。但是,如果搜索字符串是“Chapter 22”,那么表达式匹配单词“Chapter”,而不是匹配“Chapter 22”。

为了解决这种形式的表达式可能带来的误导,可以使用括号来限制替换的范围,即确保它只应用于两个单词“Chapter”和“Section”。可以通过添加括号来使正则表达式匹配“Chapter 1”或“Section 3”。将以上表达式改成如下形式:

/(Chapter|Section) [1-9][0-9]{0,1}/
ログイン後にコピー

修改后,如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。如果搜索字符串是“Chapter 22”,那么表达式匹配单词也会是“Chapter 22”。

子表达式

正则表达式中放置括号可创建子表达式,子表达式允许匹配搜索文本中的模式并将匹配项分成多个单独的子匹配项,程序可检索生成的子匹配项。

例如匹配邮箱账号的正则表达式:

/(\w+)@(\w+)\.(\w+)/
ログイン後にコピー

该正则表达式包含 3 个子表达式,3 个子表达式分别进行匹配并保留匹配结果,与其他表达式匹配结果作为一个整体显示出来。

下面的示例将通用资源指示符(URI)分解为其组件:

/(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/
ログイン後にコピー
  • 第一个括号子表达式保存 Web 地址的协议部分,匹配在冒号和两个正斜杠前面的任何单词。

  • 第二个括号子表达式保存地址的域地址部分,匹配不包括左斜线/或冒号:字符的任何字符序列。

  • 第三个括号子表达式保存网站端口号(如果指定了的话),匹配冒号后面的零个或多个数字。

  • 第四个括号子表达式保存 Web 地址指定的路径和/或页信息,匹配零个或多个数字字符#或空白字符之外的字符。

如果我们使用这个正则表达式匹配字符串“http://msdn.microsoft.com:80/scripting/default.htm”,那么 3 个子表达式的匹配结果分别为 http、msdn.microsoft.com:80、/scripting/default.htm。

反向引用

反向引用用于查找重复字符组。此外,可使用反向引用来重新排列输入字符串中各个元素的顺序和位置,以重新设置输入字符串的格式。

可以从正则表达式和替换字符串中引用子表达式。每个子表达式都由一个编号来标识,并称作反向引用。

在正则表达式中,每个保存的子匹配项按照它们从左到右出现的顺序存储。用于存储子匹配项的缓冲区编号从 1 开始,最多可存储 99 个子表达式。在正则表达式中,可以使用 \n 来访问每个缓冲区,其中 n 标识特定缓冲区的一位或两位十进制数字。

反向引用的一个应用是,提供查找文本中两个相同单词的匹配项的能力。以下面的句子为例:

Is is the cost of of gasoline going up up?
ログイン後にコピー

该句子包含多个重复的单词。如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,就会很有用。

下面的正则表达式使用单个子表达式来实现这一点:

/\b([a-z]+) \1\b/
ログイン後にコピー

在此情况下,子表达式是括在括号中的所有内容。该子表达式包括由 [a-z]+ 指定的一个或多个字母字符。正则表达式的第二部分是对以前保存的子匹配项的引用,即单词的第二个匹配项正好由括号表达式匹配。\1 用于指定第一个子匹配项。\b 单词边界元字符确保只检测单独的单词。否则,诸如“is issued”或“this is”之类的词组将不能正确地被此表达式识别。所以,使用表达式 /\b([a-z]+)\1\b/ 匹配字符串“Is is the cost of of gasoline going up up?”得到的结果为 is、of、up。

在 PHP 中使用正则表达式

PHP 有两套函数库支持的正则表达式处理操作:

  • 一套是由 PCRE(Perl Compatible Regular Expression)库提供、与 Perl 语言兼容的正则表达式函数,以preg_为函数的前缀名称;

  • もう 1 つのセットは、関数のプレフィックスとして ereg_ が付いている POSIX (Portable Operating System Interface) 拡張構文の正規表現関数です。

2 つの関数ライブラリの機能は似ていますが、PCRE の実行効率が POSIX よりも高いため、PCRE 関数ライブラリのみを紹介します。

推奨学習: 「PHP ビデオ チュートリアル

以上がPHPの正規表現ってどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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