この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:T
更新日時:2026-06-11 07:07: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 で最もよく使う置換関数。検索文字列を置換文字列に変えた新しい文字列を返します。元の文字列は変更されない(戻り値で受け取る)。

関数比較表

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

str_ireplace: 大文字小文字を無視

preg_replace: 正規表現置換

]+>/', '', '

Hello World

'); echo $s; // Hello World

preg_replace_callback: マッチ毎に動的処理

substr_replace: 位置指定置換

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

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

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

Laravel Str ヘルパ

replaceMatches('/foo/', fn ($m) => strtoupper($m[0]));
// → FOO bar

よくあるバグと対策

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

 'dog', 'dog' => 'cat']);
// → dog and cat

2. 改行コードの混在

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

性能の目安

  • 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) が安全。