プログラミング

PHP正規表現完全ガイド

PHPにおける正規表現(Regexp/PCRE)についての完全かつ包括的な記事を以下に提供いたします。


PHPにおける正規表現(Regexp/PCRE)とは?

PHPにおける正規表現(Regexp、またはPCRE:Perl Compatible Regular Expressions)は、文字列のパターンマッチングを行うための強力なツールです。正規表現を使用することで、文字列の検索、置換、分割、抽出などを効率的に実行できます。PHPでは、PCRE(Perl Compatible Regular Expressions)ライブラリを使用して、正規表現操作を行います。

正規表現の基本

正規表現は、文字列に含まれる特定のパターンを表現するための特別な構文です。これを使うことで、特定のパターンに一致する部分を見つけたり、パターンに基づいて文字列を操作することができます。

正規表現の基本的な構成

  1. 文字クラス

    • [abc] は、「a」、「b」、「c」のいずれかの文字に一致します。
    • [^abc] は、「a」、「b」、「c」以外の文字に一致します。
    • [0-9] は、0から9までの任意の数字に一致します。
  2. メタ文字

    • .(ドット)は任意の1文字に一致します。
    • ^ は文字列の先頭に一致します。
    • $ は文字列の末尾に一致します。
    • * は直前の文字が0回以上繰り返される部分に一致します。
    • + は直前の文字が1回以上繰り返される部分に一致します。
    • ? は直前の文字が0回または1回繰り返される部分に一致します。
  3. エスケープ文字
    特別な意味を持つ文字(例えば、*. など)をそのまま文字として扱いたい場合には、\(バックスラッシュ)でエスケープします。例えば、\. は「ドット」そのものに一致します。

  4. グループ化とキャプチャ

    • () を使ってパターンをグループ化し、パターンを1つの単位として扱うことができます。
    • \1\2 などで、グループ化された部分にアクセスできます。
  5. 選択

    • | は選択を表し、例えば a|b は「a」または「b」に一致します。

PHPでの正規表現関数

PHPでは、正規表現を扱うためにいくつかの関数が提供されています。これらの関数は、PCRE(Perl Compatible Regular Expressions)に基づいて動作し、強力で柔軟な文字列操作を可能にします。

1. preg_match()

preg_match() は、文字列が特定のパターンに一致するかどうかを調べるための関数です。この関数は、パターンが最初に一致した部分を返します。

php
$pattern = "/abc/"; $string = "abcdef"; if (preg_match($pattern, $string)) { echo "一致しました"; } else { echo "一致しません"; }

この例では、$pattern に「abc」というパターンが設定され、$string という文字列に対して一致を確認します。

2. preg_match_all()

preg_match_all() は、文字列中のすべての一致部分を見つけるための関数です。

php
$pattern = "/\d+/"; // 数字の連続に一致 $string = "abc 123 def 456 ghi 789"; preg_match_all($pattern, $string, $matches); print_r($matches);

この例では、文字列中のすべての数字の部分(「123」、「456」、「789」)を見つけ、結果を $matches に格納します。

3. preg_replace()

preg_replace() は、指定したパターンに一致する部分を置換するための関数です。

php
$pattern = "/[aeiou]/"; // 母音に一致 $string = "hello world"; $new_string = preg_replace($pattern, '*', $string); echo $new_string; // h*ll* w*rld

この例では、母音(a、e、i、o、u)を「*」に置換しています。

4. preg_split()

preg_split() は、正規表現を使って文字列を分割する関数です。

php
$pattern = "/\s+/"; // 空白文字で分割 $string = "this is a test"; $result = preg_split($pattern, $string); print_r($result); // Array ( [0] => this [1] => is [2] => a [3] => test )

この例では、空白文字を区切り文字として文字列を分割しています。

5. preg_replace_callback()

preg_replace_callback() は、正規表現に一致した部分をコールバック関数を使用して置換する関数です。

php
$pattern = "/(\d+)/"; // 数字に一致 $string = "abc 123 def 456"; $new_string = preg_replace_callback($pattern, function($matches) { return $matches[0] * 2; // 数字を2倍にする }, $string); echo $new_string; // abc 246 def 912

この例では、数字を2倍にする処理をコールバック関数内で実行しています。

正規表現の高度なテクニック

1. 非貪欲マッチ

正規表現はデフォルトで貪欲(greedy)です。つまり、できるだけ多くの文字に一致しようとします。しかし、非貪欲(lazy)マッチを使用すると、最小限の一致を行うことができます。

非貪欲マッチを使用するには、*?+? などの構文を使います。

php
$pattern = "/<.*?>/"; // 非貪欲マッチ $string = "
abc
def
"
; preg_match_all($pattern, $string, $matches); print_r($matches); // Array ( [0] =>
abc
[1] =>
def
)

この例では、

abc
def

の各部分に非貪欲マッチを適用しています。

2. 前方参照(Lookahead)

前方参照(Lookahead)は、あるパターンが後に続くことを確認するために使用します。例えば、特定の文字の後に別の文字が続くかどうかを確認できます。

php
$pattern = "/\d+(?=abc)/"; // 数字の後に「abc」が続く $string = "123abc 456def"; preg_match($pattern, $string, $matches); print_r($matches); // Array ( [0] => 123 )

この例では、数字の後に「abc」が続く部分を見つけています。

3. 後方参照(Lookbehind)

後方参照(Lookbehind)は、あるパターンが前にあることを確認するために使用します。

php
$pattern = "/(?<=abc)\d+/"; // 「abc」の後に続く数字 $string = "abc123 def456"; preg_match($pattern, $string, $matches); print_r($matches); // Array ( [0] => 123 )

この例では、「abc」の後に続く数字を見つけています。

結論

PHPにおける正規表現(PCRE)は、非常に強力なツールであり、文字列操作を効率的に行うために広く利用されています。preg_match()preg_replace() などの関数を使って、簡単なパターンマッチングから複雑な文字列操作まで幅広く対応できます。正規表現を適切に使用することで、PHPでの文字列処理が大幅に効率化されるでしょう。

Back to top button