この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:T
更新日時:2026-06-11 07:10:02

タイトル: 文字の置換
SEOタイトル: 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) が安全。