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の公式ドキュメントには、正規表現に関する詳細な説明が掲載されています。
公式ドキュメントを活用することで、より正確な情報を得ることができます。
まとめ
PHPで文字列を扱うとき、正規表現はとても心強い道具になります。長い文章の中から特定の文字列を探したり、複雑なパターンに一致する部分を抽出したり、数字やメールアドレス、電話番号などを検証したり、開発の現場では無数の場面で使われています。日常的に目にする入力フォーム、ユーザーが入力した情報を確認する処理、ログ解析のような大規模な文字列処理、そのどれにも正規表現が密接に関わっています。
ここまで学んだように、PHPではpreg_match、preg_match_all、preg_replace、preg_replace_callbackといった関数を使うことで、検索、抽出、置換、加工が柔軟に行えます。特に、preg_replace_callbackは、単に置き換えるだけでなく、マッチした部分を元に計算や加工を行えるので、より実践的な用途に役立ちます。
また、正規表現のパターンを組み立てる際には、^や$のような行を示す記号、[]による文字クラス、*や+などの繰り返し指定、そして{n,m}のような回数指定など、メタ文字を理解することで、一気に表現の幅が広がります。
例えば、数字だけを探す、特定の単語を抽出する、複数の単語を一括で置換する、文章の中の英単語をすべて大文字に変換する、こういった例もすべて正規表現とPHPの組み合わせで実現できます。
文字列と向き合う場面はプログラミングでも特に多く、最初は難しく感じるかもしれませんが、小さなパターンから少しずつ試していくと、だんだん慣れてきます。「数字」「メールアドレス」「文章中のパターン」のように段階的に取り組むと、正規表現に対する理解が深まり、PHPでの文字列処理が今までよりもずっと簡単に感じられるようになります。
また、正規表現のパターンは覚えるよりも、必要な場面で思い出しながら組み立てる方が実用的です。困ったときは公式ドキュメントやオンラインツールで確かめながら試せば、動き方が目に見えて分かりやすく、間違いにも気づきやすくなります。
開発をしていると、電話番号やメールアドレス、ハッシュタグ、ユーザー入力のバリデーション、ログ解析、フォームチェックなど、少し工夫が必要な文字列処理が出てきます。そうした場面に直面したとき、正規表現が使いこなせると、余分な処理を書かなくても短く分かりやすいコードが書けます。
実行速度や処理の読みやすさという面でも、正規表現は役に立ちます。複雑な条件分岐を何行も並べるより、ひとつのパターンで処理できることも少なくありません。特にPHPは文字列処理に強く、多くのシステムで正規表現が用いられています。
ここでは、正規表現を使った置換の応用例として、特定の語句を検出し、強調表示する例を見てみましょう。たとえば、文章の中に「PHP」という単語が含まれていたら、その部分を太字にするコードを書けます。
キーワードを太字にして強調する例
$text = "PHPは便利で強力な言語です。PHPを使うと文字列処理が簡単になります。";
$pattern = "/PHP/";
$replacement = "<strong>PHP</strong>";
$result = preg_replace($pattern, $replacement, $text);
echo $result;
上の例のように、preg_replaceを使うことで検索と置換を同時に行い、見やすく整えられます。 また、以下の例では、文章中に含まれている全ての数字を目立つスタイルに変えてみます。正規表現とHTMLタグを組み合わせると、ログ出力やデバッグ表示にも応用でき、視認性がぐっと上がります。
数値をハイライトする例
$text = "りんご3個、みかん10個、ぶどう25個あります。";
$pattern = "/\d+/";
$replacement = "<span class=\"text-danger fw-bold\">$0</span>";
$result = preg_replace($pattern, $replacement, $text);
echo $result;
繰り返しになりますが、正規表現は「難しそう」と感じるよりも「役に立つ」と実感しながら覚える方が身につきます。特にPHPは正規表現を扱いやすい言語であり、文字列処理にまつわる作業がぐっと楽になります。 開発において、ユーザー入力のチェックや文章の解析は避けて通れません。そこで重要になるのが、的確なパターンで文字列を扱う力です。PHPの正規表現は幅広い用途に使えるため、いくつかのパターンを覚えておくだけで作業効率が上がります。 もし複雑なパターンを書く必要が出てきた場合でも、少しずつ組み立てていけば問題ありません。短いパーツを繋ぎ合わせるように考えると、難しい式も分解でき、エラーにも気づきやすくなります。 今日学んだ内容の中で、「preg_match」で検索し、「preg_match_all」で複数抽出し、「preg_replace」で置換し、「preg_replace_callback」で加工するという流れは、PHPで文字列を扱うとき非常に頼りになる組み合わせです。どれも同じ正規表現と組み合わせて使えるため、理解が深まるほど幅広い処理に応用できます。 例えば、サイト内のテキストに広告、商品名、リンク、注意書き、フォーマットチェックなど、色々な活用ができます。正規表現の力で文章を読み取り、加工し、整形し、必要な情報だけを取り出す、そんな作業も自然とできるようになります。 文章の長短にかかわらず、文字列を扱うことは多くのプログラムで必要となる基本の一つです。PHPはその領域に非常に強く、正規表現と組み合わせることで、複雑な処理も驚くほど簡単になります。 今後プログラムを書くとき、「この情報を取り出したい」「この部分だけ置き換えたい」「この文章の中に特定のデータがあるか知りたい」という場面があれば、迷わず正規表現を試してみてください。思っているよりも少ないコードで、欲しい結果にたどり着けるはずです。
生徒
「正規表現って難しいイメージがあったんですが、実際に使ってみると便利だと感じました。preg_matchとpreg_replaceが特に使いやすかったです。」
先生
「そうでしょう?検索、抽出、置換の三つが分かるだけで、多くの場面に対応できます。特に置換は、文章整形やユーザー入力の加工で大活躍します。」
生徒
「preg_replace_callback も面白かったです。数字を倍にしたり、単語を加工したり、ただ置き換えるだけじゃないんですね。」
先生
「ええ、正規表現は柔軟性が高いので、工夫しだいで色々できます。小さい例から試しながら慣れていくと、自分の処理に合わせたパターンが作れるようになりますよ。」
生徒
「今はまだ基本的な文字列処理ですが、もっと複雑なチェックやログ解析にも使えそうですね。」
先生
「そのとおり。PHPの正規表現は実務でとても役に立ちます。必要になったときに組み立てられるよう、これからも少しずつ触ってみてください。」