PHPで文字列を置換する方法|str_replaceとpreg_replaceの使い分け・配列置換の罠

PHPで文字列を置換するには str_replace()preg_replace() があります。単純な置き換えは str_replace()パターンを使う高度な置換は preg_replace() が基本です。この記事では、配列でまとめて置換する方法や、その順序依存の落とし穴まで解説します。

この記事の結論:決まった文字列の置換は str_replace($search, $replace, $subject)、パターン置換は preg_replace($pattern, $replacement, $subject)。配列で複数置換するときは処理順序による上書きに注意します。
スポンサーリンク

str_replace()で単純に置換する

検索文字列・置換文字列・対象文字列を渡すと、一致する箇所をすべて置き換えます。

基本の置換
<?php
echo str_replace("World", "PHP", "Hello World!"); // Hello PHP!

大文字・小文字を区別せずに置換したいときは str_ireplace() を使います。

str_ireplace(大小文字を無視)
<?php
echo str_ireplace("WORLD", "PHP", "Hello world"); // Hello PHP

配列でまとめて置換する

検索・置換に配列を渡すと、複数の置換を一度に行えます。インデックスが対応する要素どうしで置き換えられます。

配列で複数置換
<?php
$search  = ["cat", "dog"];
$replace = ["猫", "犬"];
echo str_replace($search, $replace, "cat and dog"); // 猫 and 犬
配列置換は「順番に」処理されるため、後の置換が前の結果を上書きすることがあります。たとえば str_replace(["a", "b"], ["b", "c"], "a") は、まず a→b、次にその bb→c で置換するため、結果は "c" になります(意図とずれやすい)。連鎖して困る場合は、置換順序を工夫するか strtr()(同時置換)を検討します。
strtr($str, $pairs) は連想配列で同時置換するため、上記のような連鎖上書きが起きません。相互に絡む置換ではこちらが安全です。

preg_replace()でパターン置換する

「数字をすべて〇〇に」「特定の形式を変換」など、パターンで置換するなら正規表現の preg_replace() を使います。

数字をまとめて置換
<?php
echo preg_replace("/\d+/", "many", "I have 4 apples and 3 bananas.");
// I have many apples and many bananas.

正規表現の後方参照を使うと、一致した一部を並べ替えて置換できます。() で囲んだ部分を $1$2 で参照します。

後方参照で並べ替え
<?php
// 2026-06 → 06/2026
echo preg_replace("/(\d{4})-(\d{2})/", "$2/$1", "2026-06"); // 06/2026

複雑な置換はpreg_replace_callback

「一致した数値を2倍にする」など、置換内容を計算で決めたい場合はpreg_replace_callback() を使います。一致部分を受け取り、戻り値で置き換えます。

preg_replace_callbackで計算置換
<?php
$result = preg_replace_callback("/\d+/", function ($m) {
    return $m[0] * 2; // 一致した数値を2倍に
}, "a1 b2 c3");

echo $result; // a2 b4 c6

使い分け

やりたいこと 関数
決まった文字列を置換 str_replace()
大文字小文字を無視して置換 str_ireplace()
相互に絡む複数置換を同時に strtr()
パターンで置換 preg_replace()
置換内容を計算で決める preg_replace_callback()

よくある質問(FAQ)

Qstr_replaceとpreg_replaceはどう使い分けますか?
A決まった文字列の置換は str_replace()(高速・シンプル)、パターン(数字・形式など)での置換は preg_replace() です。正規表現が不要なら str_replace を使う方が速く読みやすくなります。
Q配列で置換したら結果がおかしくなりました。
A配列置換は順番に処理されるため、前の置換結果が後の置換でさらに変わることがあります。相互に絡む置換は、順序を工夫するか strtr()(同時置換)を使ってください。
Q一致した一部を並べ替えて置換したいです。
Apreg_replace()後方参照を使います。パターン側を () で囲み、置換側で $1$2 として参照します。
Q置換内容を条件や計算で決めたいです。
Apreg_replace_callback() を使います。一致部分を関数で受け取り、戻り値で置き換えるため、数値の加工や条件分岐を伴う置換ができます。

まとめ

PHPの文字列置換のポイントを整理します。

  • 決まった文字列は str_replace()、パターンは preg_replace()
  • 配列置換は順序依存で上書きに注意(同時置換は strtr()
  • 大文字小文字を無視するなら str_ireplace()
  • 並べ替えは後方参照 $1$2
  • 計算で決める置換は preg_replace_callback()

関連として、文字列に特定の文字が含まれるか確認する方法preg_splitで文字列を分割する方法文字列を結合する方法もあわせて読むと、PHPの文字列処理に強くなれます。