English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、正規表現の動作方法と、PHPで効率的にパターンマッチングを実行する方法を学びます。
正規表現は通常「 regex または RegExp 正規表現は、テキスト内のパターンを検索するための特別な形式のテキスト文字列です。正規表現は、現在利用可能な最も強力なツールの1つであり、テキストの処理と操作に非常に効果的です。例えば、ユーザーが入力したデータ形式(例:名前、メールアドレス、電話番号など)が正しいかどうかを確認したり、テキスト内で一致する文字列を検索したり、置き換えたりすることができます。
PHP(バージョン5.3及びその後のバージョンでは、preg_関数シリーズを通じてPerlスタイルの正則表現をサポートしています。なぜPerlスタイルの正則表現を使用するのか?それはPerl(実用的な抽出および報告言語)は、正則表現に統合的なサポートを提供する最初の主要なプログラミング言語であり、正則表現の強力なサポートと驚くべきテキスト処理および操作機能で知られています。
正則表現の世界に深く入る前に、まず一般的なPHPの組み込みのパターンマッチング機能を簡単に紹介します。
関数 | 説明 |
---|---|
preg_match() | 正則表現マッチングを実行します。 |
preg_match_all() | グローバルな正則表現マッチングを実行します。 |
preg_replace() | 正則表現を使用して検索および置換を実行します。 |
preg_grep() | パターンにマッチする入力配列の要素を返します。 |
preg_split() | 正則表現を使って文字列をサブストリングに分割します。 |
preg_quote() | 文字列内で見つかった正則表現の文字を引用します。 |
注意: PHP preg_match()関数は最初のマッチングが見つかったら検索を停止し、preg_match_all()関数は文字列の最後まで検索し、すべての可能性のマッチングを見つけるまで検索を続けます。preg_match_all()関数は最初のマッチングで停止しません。
正則表現の文法には特殊文字の使用が含まれます(例えばHTML特殊文字混同)。正則表現で特別な意味を持つ文字は:. * ? + [ ] ( ) { } ^ $ | \。これらの文字が文字面の意味で使用される場合は、アンシスコープ(\)が必要です。例えば「.」をマッチングする場合は\.と書かなければなりません。他のすべての文字は自動的に文字面の意味を持ちます。
以下のセクションでは、パターン作成に使用できるさまざまなオプションについて説明します:
文字クラスは、方括号で囲まれた文字パターンを指します。例えば[ABC]。文字クラスは常に指定された文字リストの単一の文字をマッチングします。これは、表現[abc]はa、b、またはcの文字だけをマッチングするという意味です。
否定の文字クラスも定義できます。否定の文字クラスは、左括号の次にエスケープシーケンス(^)を使って定義されます。例えば[^abc]。括号内に含まれる文字以外の任意の文字をマッチングします。
また、文字クラス(例えば-)の中でハイフン()を使って文字範囲[0-9。文字クラスの例を見てみましょう:
正規表現 | それは何ができますか |
---|---|
[abc] | a、b、cのいずれかの文字をマッチングします。 |
[^abc] | a、b、c以外の任意の文字をマッチングします。 |
[a-z] | 小文字aから小文字zまでの任意の文字をマッチングします。 |
[A-Z] | 大文字Aから大文字Zまでの任意の文字をマッチングします。 |
[a-Z] | 匹配从小写字母a到大写字母Z的任意一个字符。 |
[0-9] | 匹配0到9之间的一个数字。 |
[a-z0-9] | 匹配a与z之间 或 0与9之间的单个字符。 |
以下の例では、正規表現とPHPのpreg_match()関数を使用して、文字列内にパターンが存在するかどうかを検索する方法を説明します:
<?php $pattern = "/ca[kf]e/"; $text = "He was eating cake in the cafe."; if(preg_match($pattern, $text)){ echo "Match found!"; } else{ echo "Match not found."; } ?>テストを見て‹/›
同様に、preg_match_all()関数を使用して、文字列内のすべての一致項を検索できます:
<?php $pattern = "/ca[kf]e/"; $text = "He was eating cake in the cafe."; $matches = preg_match_all($pattern, $text, $array); echo $matches . " matches were found."; ?>テストを見て‹/›
提示:正则表达式不是PHP专有的。Java,Perl,Python等语言使用相同的符号来查找文本模式。
一些字符类(例如数字,字母和空格)被频繁使用,以至于它们都有快捷方式名称。下表列出了那些预定义的字符类:
捷径 | それは何ができますか |
---|---|
. | 匹配除换行符\n之外的任何单个字符。 |
\d | 匹配任何数字字符。 与[0-9]相同。 |
\D | 匹配任何非数字字符。 与[^0-9]相同 |
\s | 匹配任何空白字符(空格、制表符、换行符或回车符)。 与[\t\n\r]相同。 |
\S | 匹配任何非空格字符。 与[^\t\n\r]相同 |
\w | 匹配任何单词字符(定义为a到z,A到Z,0到9和下划线)。 与[a-zA-Z_0-9]相同 |
\W | 匹配任何非单词字符。 与[^a-Za-Z_0-9]相同 |
以下の例では、正規表現とPHPのpreg_replace()関数を使用して、文字列内でハイフンを使用して空間を検索および置き換える方法を説明します:
<?php $pattern = "/\s/"; $replacement = ""-"; $text = "Earth revolves around\nthe\tSun"; //空格、改行符、タブを置き換える echo preg_replace($pattern, $replacement, $text); echo "<br>"; //空格のみを置き換える echo " ",-",$text); ?>テストを見て‹/›
前節では、単一の文字をさまざまな方法で一致させる方法を学びました。しかし、複数の文字を一致させる場合はどうでしょうか?例えば、文字pを含む単語や、少なくとも2つのpを含む単語を探しているとします。これが量詞が役立つ場所です。量詞を使用すると、正規表現の文字が一致させるべき回数を指定できます。
以下の表は、特定のパターンを量化するための様々な方法を示しています:
正規表現 | それは何ができますか |
---|---|
p+ | 1回または複数回の回数で一致します。 |
p* | 0回または複数回の回数で一致します。 |
p? | 0回または1回の回数で一致します。 |
p{2} | 正確に2回の回数で一致します。 |
p{2,3} | 2回以上の回数で一致しますが、3回以内で一致します。 |
p{2,} | 2回またはそれ以上の回数で一致します。2回目の文字p。 |
p{3} | 文字pが最多で3回出現する場合に一致します。 |
以下の例では、正規表現はPHP preg_split()関数を使用して、文字列をコママ、コママの連続、スペース、またはそれらの組み合わせに分割します:
<?php $pattern = "/[\s,]+/"; $text = "My favourite colors are red, green and blue"; $parts = preg_split($pattern, $text); //$parts配列をループして、サブ文字列を表示します foreach($parts as $part){ echo $part . "<br>"; } ?>テストを見て‹/›
行、単語、または文字列の先頭または末尾で一致させたい場合があります。これを行うために、アンカーを使用することができます。一般的なアンカーは、文字列の先頭を示すインクリメント記号(^)と文字列の末尾を示すドル記号($)です。
正規表現 | それは何ができますか |
---|---|
^p | 行首の文字pと一致します。 |
p$ | 行末の文字pと一致します。 |
以下の例では、正規表現はPHP preg_grep()関数を使用して、名前の配列で「J」で始まる名前を表示するように設定されます:
<?php $pattern = "/^J/"; $names = array("Jhon Carter", "Clark Kent", "John Rambo"); $matches = preg_grep($pattern, $names); //$matches配列を巡回し、一致する名前を表示します foreach($matches as $match){ echo $match . "<br>"; } ?>テストを見て‹/›
パターン修飾子は、パターンマッチングの処理方法を指定することができます。パターン修飾子は正規表現の後に直接配置されます。例えば、大文字小文字を区別しないようにパターンを検索する場合、i修飾子を使用することができます:/pattern/i。以下に最もよく使われるパターン修飾子の一覧を示します。
修飾子 | それは何ができますか |
---|---|
i | マッチングを大文字小文字に関係なく行います。 |
m | 「^」および「$」の行動を変更し、文字列の境界ではなく、改行符の境界に一致させるようにします。 |
g | グローバルマッチを実行し、すべての一致項を検出します。 |
o | 表达式に対して一度だけ評価します。 |
s | 全ての文字、包括改行符を含む全ての文字に対応するように「点」の行動を変更します。 |
x | 正規表現でスペースやコメントを使用して、明確さを保つことができます。 |
以下の例では、i修飾子とPHP preg_match_all()関数を使用して、大文字と小文字を区別しないグローバル検索を実行する方法を示します。
<?php $pattern = "/color/i"; $text = "Color red is more visible than color blue in daylight."; $matches = preg_match_all($pattern, $text, $array); echo $matches . " matches were found."; ?>テストを見て‹/›
同様に、以下の例では、PHP preg_match_all()関数と^アンカーとm修飾子を使用して、多行文字列の各行の先頭でマッチする方法を示します。
<?php $pattern = "/^color/im"; $text = "Color red is more visible than \ncolor blue in daylight."; $matches = preg_match_all($pattern, $text, $array); echo $matches . " matches were found."; ?>テストを見て‹/›
単語境界文字(\b)を使用して、パターンで始まるか、/で始まる単語や、/\bcar/carで始まる単語をマッチし、cart、carrot、またはcartoonをマッチしますが、oscarをマッチしません。
同様に、正規表現/car\b/carで終わる単語をマッチし、scar、oscar、またはsupercarをマッチしますが、cartをマッチしません。同様に、/\bcar\b/carで始まり、終わる単語をマッチし、ただしcarのみをマッチします。
以下の例では、carで始まる単語を太字で強調表示します:
<?php $pattern = '/\bcar\w*/'; $replacement = '<b>$0</b>'; $text = 'carで始まる単語: cart, carrot, cartoon. carで終わる単語: scar, oscar, supercar.'; echo preg_replace($pattern, $replacement, $text); ?>テストを見て‹/›
正規表現の基本的な知識を既に理解していることを願っています。フォームデータを正規表現でバリデーションする方法を学びたい場合は、以下のPHPフォームのバリデーションのチュートリアル。