Menu

PHPの文字列置換:str_replace()の使い方

str_replace($search, $replace, $subject)は、$searchが現れるたびに$replaceへ置き換えます。検索値と置換値の配列、置換回数の取得、大文字小文字を区別しないstr_ireplace、最初の1つだけを置換する方法を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

str_replace($search, $replace, $subject)は、$subjectの中の$searchをすべて$replaceに置き換えたコピーを返します。str_replace('world', 'PHP', 'Hello world')は"Hello PHP"を返します。

この関数は新しい文字列を返すもので、渡した変数を変更するわけではありません。同じ変数に戻す場合でも、結果を代入します:$text = str_replace(...)。

構文

str_replace(
    array|string $search,
    array|string $replace,
    string|array $subject,
    int &$count = null
): string|array

最初の3つの引数は、それぞれ文字列でも配列でもかまいません。$subjectが配列なら、すべての要素に対して置換が行われ、同じキーを持つ配列が返ります:str_replace('.txt', '.md', ['a.txt', 'b.txt'])は['a.md', 'b.md']を返します。検索は大文字小文字を区別し、パターンではなくただのテキストに一致します。パターンにはpreg_replace()を使います。

複数の文字列を一度に置換する

$searchと$replaceに配列を渡します。1つ目の検索値は1つ目の置換値に、2つ目は2つ目に、と順に置き換えられます。$replaceが1つの文字列なら、すべての検索値がそれに置き換えられるので、文字の集合を取り除く短い書き方になります。

順番の罠とstrtr()

配列を渡すと、str_replace()は置換を1つずつ文字列全体に対して実行します。あとの検索が、直前の置換で挿入されたばかりのテキストに一致することがあります。配列を渡したstrtr()は1回の走査ですべてを置換し、長いキーから試し、すでに置換したテキストには触れません。

値の入れ替えや、値の中に現れるかもしれないテンプレートのプレースホルダーにはstrtr()を使います。

置換した回数を数える

4つ目の引数には、行われた置換の回数が入ります。変数を渡すと、PHPがそこに書き込みます。

str_ireplaceで大文字小文字を区別せずに置換する

str_ireplace()は同じ引数を受け取り、照合のときに大文字小文字を無視します。置換値は書いたとおりに挿入されます。

str_ireplace()が大文字小文字を同一視するのはASCIIの文字だけです。アクセント付きの文字やキリル文字を大文字小文字の区別なく置換するには、iとuの修飾子を付けたpreg_replace()を使います。

最初の1つだけを置換する

str_replace()は常にすべてを置換します。最初の一致だけを置換するには、strpos()で見つけてsubstr_replace()で切り取ります。

最後の出現なら、strpos()の代わりにstrrpos()を使います。

空白、改行などの文字を取り除く

空文字列に置換すると、そのテキストが取り除かれます。よくある後始末は改行やすべての空白を取り除くことで、日本語の入力には普通の" "の検索では一致しない全角スペース( 、U+3000)がよく含まれます。

配列の中では"\r\n"を"\n"と"\r"より前に置いてください。そうすればWindowsの改行が2つではなく1つの空白になります。

よくある質問

PHPで文字列の中のテキストを置換するには?

str_replace($search, $replace, $subject)を使います:str_replace('cat', 'dog', 'cat and cat')は"dog and dog"を返します。すべての出現を置換して新しい文字列を返し、元の文字列は変わりません。

str_replaceは大文字小文字を区別しますか?

区別します。str_replace('php', 'PHP', 'Php')は何も変えません。同じ引数を受け取って大文字小文字を無視するstr_ireplace()を使います。

PHPで最初の1つだけを置換するには?

str_replace()には回数の上限の引数がありません。strpos()で位置を探してsubstr_replace($s, $replace, $pos, strlen($search))を使うか、preg_replace('/' . preg_quote($search, '/') . '/', $replace, $s, 1)を使います。

PHPで複数の文字列を一度に置換するには?

配列を渡します:str_replace(['a', 'b'], ['1', '2'], $s)。置換は順番に実行されるので、あとの検索が前の置換で挿入されたテキストに一致することがあります。strtr($s, ['a' => '1', 'b' => '2'])は1回の走査ですべてを置換し、置換し直すことはありません。

str_replaceは日本語のテキストに使えますか?

使えます。str_replace()はバイトで照合しますが、UTF-8の完全な文字がほかの文字の内部に一致することはないので、str_replace('東京', '大阪', $s)は安全です。mb版は必要ありません。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める