PHPの正規表現を使った文字列の処理(preg_match, preg_replace)
新人
「PHPで特定の文字列を検索したり、パターンにマッチするか調べたりする方法ってありますか?」
先輩
「PHPでは正規表現を使うことで、柔軟な文字列の検索ができますよ。」
新人
「正規表現って何ですか?なんだか難しそうです…」
先輩
「最初は難しく感じるかもしれませんが、基本を押さえればとても便利ですよ。まずは正規表現の基本から見ていきましょう!」
1. 正規表現とは?
正規表現(Regular Expression)とは、特定のパターンに一致する文字列を検索するためのルールです。例えば、以下のような用途で利用できます。
- メールアドレスが正しい形式かチェックする
- 電話番号のフォーマットを確認する
- 文章の中から特定の単語を抽出する
- URLやハッシュタグを検出する
PHPでは、正規表現を扱うための関数としてpreg_match(検索)がよく使われます。
2. PHPで正規表現を使う方法
PHPでは、正規表現を使用する際にPCRE(Perl Compatible Regular Expressions)というライブラリを利用します。
正規表現のパターンはスラッシュ / で囲むのが一般的です。
$pattern = "/hello/"; // "hello" という文字列を検索
正規表現の基本的なルールは以下の通りです。
^
:行の先頭(例:^abc
→ "abc" で始まる)$
:行の末尾(例:xyz$
→ "xyz" で終わる).
:任意の1文字(例:a.c
→ "abc", "axc" など)*
:直前の文字が0回以上(例:bo*
→ "b", "bo", "boo")+
:直前の文字が1回以上(例:go+
→ "go", "goo")?
:直前の文字が0回または1回(例:colou?r
→ "color", "colour")[]
:指定した文字のいずれか(例:[aeiou]
→ 母音){n,m}
:回数指定(例:\d{2,4}
→ 2~4桁の数字)
3. preg_match の基本的な使い方
preg_match
は、文字列が特定の正規表現に一致するかどうかを調べる関数です。
if (preg_match("/hello/", "hello world")) {
echo "マッチしました!";
} else {
echo "マッチしませんでした。";
}
実行結果:
マッチしました!
このコードでは、"hello world" に "hello" という文字が含まれているため、マッチします。
部分一致を取得する
preg_match
を使って、マッチした部分を取得することもできます。
$pattern = "/([0-9]+)円/";
$text = "商品Aは500円、商品Bは1200円です。";
if (preg_match($pattern, $text, $matches)) {
echo "最初に見つかった価格: " . $matches[1] . "円";
}
実行結果:
最初に見つかった価格: 500円
このように、$matches[1]
に一致した数値部分(500)が格納されます。
4. preg_match_all の使い方
preg_match
は最初にマッチした1つの結果しか取得できませんが、preg_match_all
を使うと、文字列内のすべてのマッチを取得できます。
例えば、文章の中からすべてのメールアドレスを抽出する場合、以下のように記述します。
$pattern = "/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/";
$text = "連絡先: user1@example.com, user2@test.co.jp, info@company.net";
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
実行結果:
Array
(
[0] => user1@example.com
[1] => user2@test.co.jp
[2] => info@company.net
)
このように、文章の中にあるすべてのメールアドレスを取得できます。
5. preg_replace の基本的な使い方
preg_replace
を使うと、特定のパターンに一致する文字列を別の文字列に置き換えることができます。
例えば、電話番号を「非公開」に置き換えるには以下のように記述します。
$text = "電話番号は 090-1234-5678 です。";
$pattern = "/[0-9]{3}-[0-9]{4}-[0-9]{4}/";
$replacement = "[非公開]";
$new_text = preg_replace($pattern, $replacement, $text);
echo $new_text;
実行結果:
電話番号は [非公開] です。
このように、特定のパターンに一致する文字列を簡単に置き換えられます。
複数の置換を一度に行う
preg_replace
は、配列を使って複数の文字列を同時に置き換えることもできます。
$text = "これはテストです。PHPは素晴らしい!";
$patterns = ["/テスト/", "/PHP/"];
$replacements = ["試験", "プログラミング言語"];
$new_text = preg_replace($patterns, $replacements, $text);
echo $new_text;
実行結果:
これは試験です。プログラミング言語は素晴らしい!
このように、複数の単語を一度に置き換えることができます。
6. 正規表現のメタ文字
正規表現では、特殊な意味を持つ記号(メタ文字)を使って高度な検索を行えます。主なメタ文字の意味を解説します。
行の先頭・末尾を指定する
^
:行の先頭(例:^hello
は "hello" で始まる文字列)$
:行の末尾(例:world$
は "world" で終わる文字列)
例:
$pattern = "/^PHP/";
$text = "PHPは便利な言語です。";
if (preg_match($pattern, $text)) {
echo "この文章は 'PHP' で始まっています。";
}
実行結果:
この文章は 'PHP' で始まっています。
任意の1文字にマッチする
.
は任意の1文字にマッチします。
$pattern = "/c.t/";
$text = "cat, cut, cot, cbt";
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
実行結果:
Array
(
[0] => cat
[1] => cut
[2] => cot
)
文字クラスを使う
角括弧 []
を使って、特定の文字のいずれかにマッチできます。
[aeiou]
:母音のいずれか[0-9]
:数字[a-z]
:小文字のアルファベット[A-Z]
:大文字のアルファベット
例えば、数字をすべて「#」に置き換える場合:
$text = "電話番号: 080-1234-5678";
$pattern = "/[0-9]/";
$replacement = "#";
$new_text = preg_replace($pattern, $replacement, $text);
echo $new_text;
実行結果:
電話番号: ###-####-####
繰り返しを指定する
*
:0回以上の繰り返し+
:1回以上の繰り返し?
:0回または1回{n}
:ちょうどn回{n,}
:n回以上{n,m}
:n回以上m回以下
例:
$pattern = "/a{2,4}/";
$text = "aaa, aaaa, aaaaa";
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
実行結果:
Array
(
[0] => aaa
[1] => aaaa
)
このように、a
の2回以上4回以下の繰り返しを検索できます。
7. preg_replace_callback を使った応用
preg_replace_callback
は、正規表現にマッチした部分を動的に変更する際に使います。単純な置換ではなく、マッチした内容を元にして処理を行う場合に便利です。
例えば、文章の中の数値をすべて2倍にする場合、以下のように記述します。
$text = "りんご3個、みかん5個、ぶどう10個";
$pattern = "/\d+/";
$new_text = preg_replace_callback($pattern, function($matches) {
return $matches[0] * 2;
}, $text);
echo $new_text;
実行結果:
りんご6個、みかん10個、ぶどう20個
このように、単なる文字列置換ではなく、プログラムを介して動的に変更できます。
英単語の大文字・小文字を変換する
次の例では、文章中のすべての英単語を大文字に変換します。
$text = "php is a powerful scripting language.";
$pattern = "/[a-z]+/";
$new_text = preg_replace_callback($pattern, function($matches) {
return strtoupper($matches[0]);
}, $text);
echo $new_text;
実行結果:
PHP IS A POWERFUL SCRIPTING LANGUAGE.
このように、preg_replace_callback
を使えば、マッチした単語を加工することができます。
8. 正規表現を活用した実践的な例
ここでは、メールアドレスの検証や電話番号のフォーマットチェックなど、実際の開発でよく使われる例を紹介します。
メールアドレスの検証
メールアドレスの形式が正しいかどうかをチェックする正規表現を見てみましょう。
$email = "user@example.com";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
echo "有効なメールアドレスです。";
} else {
echo "無効なメールアドレスです。";
}
実行結果:
有効なメールアドレスです。
このように、簡単な正規表現を使えば、基本的なメールアドレスのフォーマットをチェックできます。
電話番号のフォーマットチェック
次に、日本の電話番号のフォーマットをチェックする例を紹介します。
$phone = "090-1234-5678";
$pattern = "/^\d{2,4}-\d{2,4}-\d{4}$/";
if (preg_match($pattern, $phone)) {
echo "正しい電話番号の形式です。";
} else {
echo "無効な電話番号です。";
}
実行結果:
正しい電話番号の形式です。
この正規表現を使うことで、日本の電話番号の基本的なフォーマットを検証できます。
9. 正規表現を学ぶためのおすすめの方法
正規表現は、書くだけではなく、試しながら学ぶことで理解が深まります。以下の方法を活用して、実際に正規表現を試してみましょう。
オンラインツールを活用する
正規表現を試せるオンラインツールを使うと、リアルタイムでマッチ結果を確認できます。
これらのツールを使うことで、正規表現がどのように動作するのかを視覚的に確認できます。
小さな正規表現から試す
いきなり複雑な正規表現を作るのではなく、簡単なパターンから試して少しずつ複雑なものにするのがおすすめです。
例えば、以下のように段階的に学んでいくと理解しやすくなります。
- 特定の単語を検索する(例:
/hello/
) - 数字を検索する(例:
/\d+/
) - メールアドレスを検索する(例:
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
)
PHPのドキュメントを活用する
PHPの公式ドキュメントには、正規表現に関する詳細な説明が掲載されています。
公式ドキュメントを活用することで、より正確な情報を得ることができます。