「文章中のURLを自動でリンクにしたい」
このように、PHPで特定のルールに沿って文字列を柔軟に置換したい場面は頻繁にあります。
そんな時に絶大なパワーを発揮するのが、正規表現を使った置換です。
この記事では、PHPのpreg_replace
関数を使いこなすための方法を、初心者にもわかりやすく、基本から応用まで徹底的に解説していきます。
サンプルコードはすべてコピー&ペーストしてすぐに実行できるので、ぜひ手を動かしながら読み進めてみてください。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 657,000円 (最大約53万円の給付金が適用される) |
|
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
正規表現の置換とは? str_replaceとの違い
PHPには文字列を置換する関数としてstr_replace
もありますが、preg_replace
とは役割が異なります。
str_replace
:特定の文字列を、別の文字列に置換する。単純な一対一の置換に使う。preg_replace
:正規表現にマッチした部分を、別の文字列に置換する。「数字のみ」「アルファベットの大文字」といったパターンでの置換が可能。
例えば、「ABC」という文字列を「XYZ」に置換するだけなら、シンプルで高速なstr_replace
が適しています。
しかし、「全ての半角数字」や「メールアドレスの形式に合う文字列」といった、ある規則性を持った部分を置換したい場合には、preg_replace
の出番となるわけです。
preg_replace関数の基本的な使い方
それでは、preg_replace
関数の基本的な構文と引数の役割から見ていきましょう。
基本構文
preg_replace
は以下のような形で使用します。
preg_replace(パターン, 置換後の文字列, 対象の文字列, 置換回数の上限, 置換した数);
必須の引数は最初の3つです。
それぞれの役割を詳しく解説します。
$pattern
(パターン):どのような文字列を探すかを正規表現で指定します。正規表現は通常、/
(デリミタ)で囲む必要があります。例:'/abc/'
$replacement
(置換後の文字列):パターンにマッチした部分を、何に置き換えるかを指定します。$subject
(対象の文字列):置換処理を行う元の文字列、または文字列の配列を指定します。$limit
(置換回数の上限):オプションの引数。置換を行う最大回数を指定できます。デフォルトは-1
で、マッチした箇所をすべて置換します。$count
(置換した数)オプションの引数。ここに変数を指定すると、その変数に実際に置換が行われた回数が格納されます。
簡単な置換の例
まずは一番シンプルな例を見てみましょう。
文字列の中から、すべての半角数字を*
に置き換えてみます。
<?php
// 対象の文字列
$subject = '私の電話番号は090-1234-5678です。';
// パターン(半角数字にマッチ)
$pattern = '/[0-9]/';
// 置換後の文字列
$replacement = '*';
// preg_replaceで置換を実行
$result = preg_replace($pattern, $replacement, $subject);
echo $result;
?>
実行結果は以下の通りです。
私の電話番号は***-****-****です。
このコードでは、正規表現パターン/[0-9]/
が0
から9
までのいずれかの半角数字一文字にマッチします。
preg_replace
は$subject
の中からこのパターンに合う文字をすべて探し出し、*
に置き換えているのです。
実践的なpreg_replaceの活用例
preg_replace
の真価は、より複雑なルールでの置換で発揮されます。
ここでは、実務でよく使われる具体的な活用例をいくつか紹介しましょう。
特定の文字を削除する(ハイフンの除去)
置換後の文字列に空文字(''
)を指定すれば、マッチした部分を削除できます。
例えば、電話番号や郵便番号に含まれるハイフンを取り除く処理は頻繁に発生します。
<?php
$subject = '電話番号: 090-1234-5678';
$pattern = '/-/'; // ハイフンにマッチ
$replacement = ''; // 空文字に置換
$result = preg_replace($pattern, $replacement, $subject);
echo $result;
?>
実行結果は以下の通りです。
電話番号: 09012345678
複数のルールで一度に置換する(配列の利用)
$pattern
と$replacement
に配列を渡すことで、複数の置換ルールを一度の関数呼び出しで適用できます。
<?php
$subject = '今日は天気が良いので、PHPの勉強をします。';
// パターンを配列で指定
$patterns = ['/天気/', '/勉強/'];
// 置換後の文字列を配列で指定
$replacements = ['気温', 'プログラミング'];
$result = preg_replace($patterns, $replacements, $subject);
echo $result;
?>
実行結果は以下の通りです。
今日は気温が良いので、PHPのプログラミングをします。
$patterns
の1番目の要素が$replacements
の1番目に、2番目の要素が2番目に、というように対応して置換が実行されます。
マッチした部分を再利用する「後方参照」
正規表現の中でも特に重要なテクニックが「後方参照」です。
パターンの一部を()
で囲むと、その部分を後から$1
, $2
… という形で参照して、置換後文字列の中で再利用できます。
日付のフォーマットをYYYY-MM-DD
からYYYY年MM月DD日
へ変換する例を見てみましょう。
<?php
$subject = '今日は2025-09-30です。';
// YYYY, MM, DDの部分をそれぞれ()で囲んでキャプチャする
$pattern = '/([0-9]{4})-([0-9]{2})-([0-9]{2})/';
// キャプチャした部分を$1, $2, $3で参照する
$replacement = '$1年$2月$3日';
$result = preg_replace($pattern, $replacement, $subject);
echo $result;
?>
実行結果は以下の通りです。
今日は2025年09月30日です。
([0-9]{4})
: 4桁の数字(年)にマッチし、$1
としてキャプチャされます。([0-9]{2})
: 2桁の数字(月)にマッチし、$2
としてキャプチャされます。([0-9]{2})
: 2桁の数字(日)にマッチし、$3
としてキャプチャされます。
このように、元の文字列の一部を活かしながらフォーマットを整える場合に、後方参照は絶大な効果を発揮します。
PHPの正規表現におけるさらに高度な置換テクニック
単純な置換だけでなく、より複雑なロジックを伴う処理を行いたい場合は、preg_replace_callback
関数が役立ちます。
preg_replace_callbackで動的な置換処理
preg_replace_callback
は、置換文字列を直接指定する代わりに、マッチした部分を処理する「コールバック関数」を指定します。
これにより、マッチした値に応じて動的に置換内容を決定するといった、高度な処理が実現できます。
例として、文章中のすべての単語の頭文字を大文字にしてみましょう。
<?php
$subject = 'welcome to the world of php.';
// [a-zA-Z]+ でアルファベットの単語にマッチ
$pattern = '/[a-zA-Z]+/';
$result = preg_replace_callback(
$pattern,
function ($matches) {
// マッチした文字列全体は$matches[0]に格納される
// ucwordsで単語の頭文字を大文字に変換して返す
return ucwords($matches[0]);
},
$subject
);
echo $result;
?>
実行結果は以下の通りです。
Welcome To The World Of PHP.
コールバック関数には、マッチした部分の情報が配列$matches
として渡されます。
$matches[0]
にはマッチした文字列全体が格納されているため、これに対してPHPの関数(ここではucwords
)で処理を行い、その結果を返すことで置換が完了します。
よくあるエラーと注意点
正規表現の置換は強力ですが、いくつか初心者が陥りがちな注意点があります。
デリミタを忘れる
正規表現パターンは/
などのデリミタで囲む必要があります。
これを忘れるとWarning: preg_replace(): No ending delimiter
という警告が発生します。
$pattern = '[0-9]';
// 誤り $pattern = '/[0-9]/';
// 正しい
特殊文字をエスケープしない
正規表現では.
*
+
?
()
[]
{}
$
^
|
\
といった文字は特別な意味を持ちます。
これらの文字自体にマッチさせたい場合は、直前に\
(バックスラッシュ)を置いてエスケープする必要があります。
例えば、URL中の.
にマッチさせたい場合は/\./
と記述します。
まとめ
preg_replace
を使いこなせるようになると、PHPでの文字列操作の可能性が大きく広がります。
最初は正規表現の記述に戸惑うかもしれませんが、今回紹介したような基本的なパターンや後方参照の使い方を覚えれば、多くの場面で対応できるようになるはずです。
なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。