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

正規表現の基本
正規表現は、文字列に含まれる特定のパターンを表現するための特別な構文です。これを使うことで、特定のパターンに一致する部分を見つけたり、パターンに基づいて文字列を操作することができます。
正規表現の基本的な構成
-
文字クラス:
[abc]
は、「a」、「b」、「c」のいずれかの文字に一致します。[^abc]
は、「a」、「b」、「c」以外の文字に一致します。[0-9]
は、0から9までの任意の数字に一致します。
-
メタ文字:
.
(ドット)は任意の1文字に一致します。^
は文字列の先頭に一致します。$
は文字列の末尾に一致します。*
は直前の文字が0回以上繰り返される部分に一致します。+
は直前の文字が1回以上繰り返される部分に一致します。?
は直前の文字が0回または1回繰り返される部分に一致します。
-
エスケープ文字:
特別な意味を持つ文字(例えば、*
や.
など)をそのまま文字として扱いたい場合には、\
(バックスラッシュ)でエスケープします。例えば、\.
は「ドット」そのものに一致します。 -
グループ化とキャプチャ:
()
を使ってパターンをグループ化し、パターンを1つの単位として扱うことができます。\1
や\2
などで、グループ化された部分にアクセスできます。
-
選択:
|
は選択を表し、例えば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 = "abcdef";
preg_match_all($pattern, $string, $matches);
print_r($matches); // Array ( [0] => abc [1] => 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での文字列処理が大幅に効率化されるでしょう。