13.

PHP 文字列置換完全ガイド — str_replace / preg_replace 使い分け

編集
この記事の要点
  • str_replace($search, $replace, $subject) が最も基本。検索文字列と置換後文字列を渡すだけ
  • 配列渡し可: str_replace(["a", "b"], ["X", "Y"], $s) で複数置換を一度に
  • 大文字小文字を無視するなら str_ireplace、正規表現が必要なら preg_replace
  • preg_replace_callback でマッチ毎にコールバック実行(動的置換)
  • 位置指定なら substr_replace、文字単位の対応表なら strtr
  • Laravel では Str::replace / Str::replaceFirst / Str::replaceLast が便利
  • よくあるバグ: 改行コード (CRLF vs LF) / マルチバイトのエンコーディング / 配列順序依存でドミノ置換

str_replace の基本

PHP で最もよく使う置換関数。検索文字列を置換文字列に変えた新しい文字列を返します。元の文字列は変更されない(戻り値で受け取る)。

<?php
// 基本
$s = str_replace('PHP', 'Python', 'I love PHP');
echo $s; // I love Python

// 配列で複数置換
$s = str_replace(['Mon', 'Tue'], ['月', '火'], 'Mon Tue Wed');
echo $s; // 月 火 Wed

// 置換数を取得
$count = 0;
$s = str_replace('a', 'A', 'banana', $count);
echo "$s ($count)"; // bAnAnA (3)

// 配列の subject に対して一括適用
$arr = str_replace('foo', 'bar', ['foo1', 'foo2', 'baz']);
// → ['bar1', 'bar2', 'baz']

関数比較表

関数機能大文字小文字正規表現
str_replace単純置換区別する×
str_ireplace単純置換区別しない×
preg_replace正規表現置換パターン依存
preg_replace_callbackマッチ毎にコールバックパターン依存
substr_replace位置指定置換×
strtr文字 / ペア対応表で置換区別する×

str_ireplace: 大文字小文字を無視

<?php
echo str_replace('php', 'Python', 'I love PHP');
// → I love PHP (置換されない)

echo str_ireplace('php', 'Python', 'I love PHP');
// → I love Python (大文字小文字無視で置換)

preg_replace: 正規表現置換

<?php
// 連続するスペースを 1 つにまとめる
$s = preg_replace('/\s+/', ' ', "hello   world\n\nbye");
echo $s; // hello world bye

// 後方参照 $1, $2 でグループ取得
$s = preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', '2026-05-18');
echo $s; // 18/05/2026

// 修飾子: i (大文字小文字無視), u (UTF-8), s (.が改行にマッチ)
$s = preg_replace('/php/i', 'Python', 'PHP and php');
echo $s; // Python and Python

// 削除したいときは置換先を空文字
$s = preg_replace('/<[^>]+>/', '', '<p>Hello <b>World</b></p>');
echo $s; // Hello World

preg_replace_callback: マッチ毎に動的処理

<?php
// 数値だけ 2 倍にする
$s = preg_replace_callback('/\d+/', function ($m) {
    return $m[0] * 2;
}, 'a1 b2 c3');
echo $s; // a2 b4 c6

// 大文字化
$s = preg_replace_callback('/\b\w+\b/', function ($m) {
    return ucfirst(strtolower($m[0]));
}, 'HELLO world FROM php');
echo $s; // Hello World From Php

substr_replace: 位置指定置換

<?php
// 5 文字目から 3 文字を「XXX」に
echo substr_replace('abcdefghij', 'XXX', 4, 3);
// → abcdXXXhij

// 後ろから (負の値) - 末尾 3 文字を削除
echo substr_replace('abcdefghij', '', -3);
// → abcdefg

// クレジットカード番号マスク
$card = '1234-5678-9012-3456';
echo substr_replace($card, str_repeat('*', 11), 5, 11);
// → 1234-***********3456

strtr: 文字対応表 / ペア辞書で置換

 'dogs',
    'dogs' => 'cats',
]);
// → I like dogs and cats   (str_replace だと両方 'cats' になる)

// HTML エスケープを自前実装するなら
echo strtr('
', ['<' => '<', '>' => '>']); // → <div>

Laravel Str ヘルパ

<?php
use Illuminate\Support\Str;

Str::replace('PHP', 'Python', 'I love PHP');     // I love Python
Str::replaceFirst('a', 'X', 'aaa');              // Xaa
Str::replaceLast('a', 'X', 'aaa');               // aaX
Str::replaceArray('?', ['Mon', 'Tue'], '? ? Wed'); // Mon Tue Wed

// マッチ後の処理(Laravel 9+)
Str::of('foo bar')->replaceMatches('/foo/', fn ($m) => strtoupper($m[0]));
// → FOO bar

よくあるバグと対策

1. 配列順序依存のドミノ置換

<?php
// 期待: cat ↔ dog の入れ替え
echo str_replace(['cat', 'dog'], ['dog', 'cat'], 'cat and dog');
// → dog and dog  (cat → dog → cat と 2 段適用される)

// 正しくは strtr を使う
echo strtr('cat and dog', ['cat' => 'dog', 'dog' => 'cat']);
// → dog and cat

2. 改行コードの混在

<?php
// Windows 由来の CRLF と Unix の LF を統一
$s = str_replace(["\r\n", "\r"], "\n", $input);
// 順序が重要: 先に CRLF を LF にしてから残りの CR を LF に

3. マルチバイト文字 / UTF-8

<?php
// preg_replace は u 修飾子をつける
$s = preg_replace('/[ぁ-ん]+/u', '*', 'Hello ひらがな');
echo $s; // Hello *

// str_replace はバイト列で動作するので UTF-8 でも基本 OK だが
// 正規表現を絡めるなら必ず /u をつける

性能の目安

  • str_replace > strtr > preg_replace: 単純置換なら str_replace が最速
  • 大量データで複数パターンを置換するなら、まとめて strtr の連想配列がベスト
  • 正規表現は遅い → 静的な文字列で済むなら使わない

FAQ

Q: 最初の 1 回だけ置換したい
A: preg_replace('/foo/', 'bar', $s, 1) の第 4 引数で回数指定、または Str::replaceFirst

Q: 大文字小文字無視で正規表現
A: パターンに i 修飾子: preg_replace('/foo/i', 'bar', $s)

Q: 全角空白を半角に
A: mb_convert_kana($s, "s", "UTF-8") が確実。str_replace でもできますが意図が伝わりにくい。

Q: HTML タグだけ削除したい
A: 自前 preg_replace より strip_tags($s) が安全。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 記述方法
  2. コメント
  3. 変数の宣言
  4. 関数
  5. 演算子
  6. 条件文
  7. 配列
  8. 連想配列
  9. ループ処理
  10. 非同期処理
  11. 同期処理
  12. 確認ウィンドウを表示する方法
  13. 文字の置換
  14. base urlを取得する方法
  15. formのsubmit前にjavascriptを呼び出す方法
  16. undefinedのイコール判定
  17. Javascript のみで form を post で submit する方法

最近更新/作成されたページ