str_replace() / str_ireplace()
| 対応: | PHP 4(2000) |
|---|
文字列内の指定した文字列をすべて別の文字列に置換します。大文字・小文字を区別せずに置換したい場合は『str_ireplace()』を使用してください。
構文
// 一致したすべての部分を置換します str_replace($search, $replace, $subject, &$count); // 大文字・小文字を区別せずに置換します str_ireplace($search, $replace, $subject, &$count);
関数一覧
| 関数 | 概要 |
|---|---|
| str_replace($search, $replace, $subject) | $subject 内の $search をすべて $replace に置換した文字列を返します。大文字・小文字を区別します。 |
| str_ireplace($search, $replace, $subject) | 大文字・小文字を区別せずに置換します。それ以外の動作は『str_replace()』と同じです。 |
戻り値
置換後の文字列を返します。第4引数に変数を渡すと、置換が行われた回数が格納されます。
基本的な文字列の置換
単純な文字列の置換、大文字・小文字を区別しない置換、置換回数の取得です。
sample_str_replace.php
<?php
// 単純な文字列置換
$title = "item_a のデータ";
echo str_replace("item_a", "item_b", $title);
// 複数箇所すべてを置換する
$text = "item_a と item_a を比較";
echo str_replace("item_a", "item_c", $text);
// str_ireplace() は大文字・小文字を区別しない
echo str_ireplace("item", "ITEM", "Item item ITEM");
// 空文字列に置換して削除する
$tagged = "これは<b>item_a</b>のデータだ";
echo str_replace(["<b>", "</b>"], "", $tagged);
// 第4引数で置換回数を取得する
$count = 0;
$result = str_replace("item", "entry", "itemの名はitemの誇り", $count);
echo $result;
echo $count;
実行すると次のように出力されます。
php sample_str_replace.php item_b のデータ item_c と item_c を比較 ITEM ITEM ITEM これはitem_aのデータだ entryの名はentryの誇り 2
配列による一括置換
検索文字列と置換文字列にそれぞれ配列を渡すことで、複数の置換を一度に行えます。テンプレートエンジン風の文字列組み立てにも活用されます。
sample_str_replace2.php
<?php
// 配列を使った複数文字列の一括置換
$search = ["item_a", "item_b", "item_c"];
$replace = ["entry_1", "entry_2", "entry_3"];
$text = "item_a と item_b と item_c が集まった";
echo str_replace($search, $replace, $text);
// テンプレートエンジン風の文字列組み立て
$template = "{{name}}、ご注文番号は{{order}}です。担当: {{staff}}";
$keys = ["{{name}}", "{{order}}", "{{staff}}"];
$values = ["user_1", "A-12345", "user_2"];
echo str_replace($keys, $values, $template);
// 置換回数を取得する(配列置換でも同様に機能する)
$count = 0;
$result = str_replace(["item_a", "item_b"], ["entry_1", "entry_2"], "item_a と item_b と item_a", $count);
echo $result;
echo $count;
実行すると次のように出力されます。
php sample_str_replace2.php entry_1 と entry_2 と entry_3 が集まった user_1、ご注文番号はA-12345です。担当: user_2 entry_1 と entry_2 と entry_1 3
実践パターン(HTMLサニタイズ・改行コードの統一)
HTMLタグの除去や改行コードの統一など、実際のアプリケーションでよく使われるパターンです。
sample_str_replace3.php
<?php
// HTMLタグを除去する(strip_tags より限定的なタグだけ除去したい場合)
$html = "<p>item_a は<b>重要</b>なデータだ。</p>";
$clean = str_replace(["<p>", "</p>", "<b>", "</b>"], "", $html);
echo $clean;
// 改行コードを LF に統一する
$text = "1行目\r\n2行目\r3行目\n4行目";
$unified = str_replace(["\r\n", "\r"], "\n", $text);
echo $unified;
// URL スラッグ生成(スペースをハイフンに置換)
$title = "Product X vs Product Y";
$slug = strtolower(str_replace(" ", "-", $title));
echo $slug;
実行すると次のように出力されます。
php sample_str_replace3.php item_a は重要なデータだ。 1行目 2行目 3行目 4行目 product-x-vs-product-y
概要
『str_replace()』は文字列内の指定した部分をすべて置換する関数です。検索文字列と置換文字列に配列を渡すことで、複数の置換を一度に行えます。配列を渡す場合、置換は左から順番に適用されるため、先に置換された結果がさらに置換される可能性がある点に注意してください。
『str_ireplace()』は大文字・小文字を区別しないバージョンです。HTMLタグやキーワードなど、大文字・小文字が混在する文字列を処理する際に便利です。
正規表現を使った高度な置換が必要な場合は preg_replace() を使用してください。文字列の検索には『strpos()』、文字列の分割には『explode()』が便利です。
配列置換の順序依存:先の置換結果が後の検索にヒットする
配列で複数置換する際、置換は左から順番に適用されます。先に行われた置換の結果が、後の検索にヒットする場合があります。
問題のある例(意図した結果にならない):
str_replace_ng.php
<?php // 「A」→「AB」→「ABC」と段階的に置換したい $result = str_replace(["A", "AB"], ["AB", "ABC"], "A"); echo $result;
実行すると次のように出力されます。
php str_replace_ng.php ABC
「A」→「AB」が先に実行され、その「AB」が続けて「ABC」に置換されるため、単に「AB」にしたかっただけなのに「ABC」になってしまいます。意図した順序依存の置換が必要な場合は、str_replace を複数回に分けます:
str_replace_ok.php
<?php
// 段階的に置換する(順序を制御するため str_replace を複数回呼ぶ)
$str = "A";
$str = str_replace("AB", "ABC", $str);
$str = str_replace("A", "AB", $str);
echo $str;
実行すると次のように出力されます。
php str_replace_ok.php AB
$searchと$replaceの要素数が異なる場合の挙動
$search と $replace の配列要素数が一致しない場合、PHPは対応する置換文字列がない検索文字列を空文字列で置換します。意図しない削除が起きやすいため注意が必要です。
要素数が合っていない例:
str_replace_ng2.php
<?php // $replace の要素が足りない(2要素 vs 3要素) $search = ["item_a", "item_b", "item_c"]; $replace = ["entry_1", "entry_2"]; $text = "item_a と item_b と item_c"; echo str_replace($search, $replace, $text);
実行すると次のように出力されます。
php str_replace_ng2.php entry_1 と entry_2 と
「item_c」が空文字列に置換されて消えてしまいます。$search と $replace の要素数を必ず揃えます:
str_replace_ok2.php
<?php // 要素数を揃える $search = ["item_a", "item_b", "item_c"]; $replace = ["entry_1", "entry_2", "entry_3"]; $text = "item_a と item_b と item_c"; echo str_replace($search, $replace, $text);
実行すると次のように出力されます。
php str_replace_ok2.php entry_1 と entry_2 と entry_3
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。