PHPで文字列を置換する4つの方法!(str_replaceなど)

PHP

PHPで文字列を置換する方法について書いています。
PHPで文字列を置換するには、下記の関数を使うことができます。

・str_replace関数
・str_ireplace関数
・preg_replace関数
・strtr関数

サンプルコードは、PHPバージョン8.1.8で検証しています。

str_replace関数で置換する

str_replace関数を使うことで、置換対象の文字列を指定文字列で検索して、対象になった全ての文字列を置換します。
公式ドキュメントはこちらにあります。

例えば、下記のように使います。

<?php
$colors = 'red blue green yellow';
$colors = str_replace('blue', 'skyblue', $colors); # red skyblue green yellow
echo $colors;

$colors変数に置換対象文字列「red blue green yellow」を代入しています。
次の行で、str_replace関数を使っています。

第1引数に検索する文字列、第2引数に置換後の文字列、第3引数に置換対象の文字列を渡しています。
実行すると、置換後の文字列が返り値として返ってくるので、$colors変数を上書き代入しています。

echoを使って、出力すると「red skyblue green yellow」となりました。
検索文字の「blue」から置換対象の「skyblue」に置換されたことが確認できました。

複数箇所を置換する

複数の対象文字列があった場合には、全て置換されます。
例えば、下記のような場合です。

<?php
$colors = 'red blue red blue red';
$colors = str_replace('red', 'green', $colors);
echo $colors; // green blue green blue green

$colors変数に置換対象文字列「red blue red blue red」を代入しています。

次の行で、str_replace関数を使って置換しています。
検索文字列が「red」で置換後文字列が「green」です。
文字列の「red」が複数ありますが、これを「green」に置換します。

置換後の$colors変数を出力すると、全て変換されて「green blue green blue green」になっていることが確認できました。

大文字・小文字は区別する

str_replace関数では、大文字と小文字は区別されます。
そのため、下記のような置換では、大文字は対象になりません。

<?php
$colors = 'Red blue Red blue red';
$colors = str_replace('red', 'green', $colors);
echo $colors; // Red blue Red blue green

先ほどのプログラムの置換対象文字列の一部を変えました。
最初と中間に出現する「red」の先頭を大文字にしています。

この対象文字列を検索文字列「red」、置換後文字列「green」で置換します。
大文字・小文字を区別するために、最後の「red」だけ置換されて「Red blue Red blue green」となりました。

str_ireplace関数で置換する

str_ireplace関数はstr_replace関数の大文字・小文字を区別せずに置換するバージョンです。
公式ドキュメントはこちらにあります。

先ほどの大文字・小文字の「red」が並んでいるプログラムにstr_ireplace関数を使ってみます。

<?php
$colors = 'Red blue Red blue red';
$colors = str_ireplace('red', 'green', $colors);
echo $colors; // green blue green blue green

$colors変数に置換対象の文字列「Red blue Red blue red」を代入しています。
次の行で、str_ireplace関数を使っています。

検索文字列が「red」、置換後文字列が「green」で置換して、結果を$colors変数に上書き代入しています。
echoで出力すると、「green blue green blue green」が出力されました。
str_replace関数では置換されなかった、先頭大文字の箇所が置換されたことが確認できました。

preg_replace関数で置換する

preg_replace関数を使うと、正規表現で置換対象の箇所を探して、置換することが可能です。
公式ドキュメントはこちらにあります。

例えば、下記のように使います。

<?php
$text = 'apple100 orange150 grape200';
$result = preg_replace('/[0-9]{3}/', '999', $text);
echo $result; // apple999 orange999 grape999

$text変数に置換対象文字列「apple100 orange150 grape200」を代入しています。

次の行で、preg_replace関数を使っています。
第1引数に文字列を検索する正規表現、第2引数に置換後文字列、第3引数に置換対象文字列を渡しています。

検索対象の文字列として、「/[0-9]{3}/」を指定しています。これで数値が3つ並んでいる箇所が対象になります。
文字列の中の「100, 150, 200」が対象になって、置換後は「999」になります。
echoで確認すると「apple999 orange999 grape999」が出力されました。

複数対象を置換する

検索対象と置換対象に配列を渡して、複数の箇所を置換することができます。
例えば、下記のように使います。

<?php
$text = 'apple100 banana150';

$pattern = ['/[0-9]{3}/', '/apple/', '/banana/'];
$replace = ['', 'apple is red. ', 'banana is yellow.'];
$result = preg_replace($pattern, $replace, $text);
echo $result; // apple is red.  banana is yellow.

$text変数に置換対象文字列の「apple100 banana150」を代入しました。

その後に検索する正規表現を$pattern配列に定義しています。
$replace配列は、検索に対応して、置換する値になります。

/[0-9]{3}/」で数値3桁の箇所が見つかったら、空文字「”」にして
/apple/」で文字列「apple」が見つかったら「apple is red.」に置換するといった形になります。
同様にして、「’/banana/’」で文字列「banana」が見つかったら「banana is yellow.」に置換します。

preg_replace関数を呼び出して、第1引数に定義した$pattern(正規表現配列)、第2引数に$replace(置換文字列の配列)を渡しました。
第3引数には、置換する文字列です。
echoで出力すると、ひとつずつ置換されて「apple is red. banana is yellow.」が出力されました。

複数対象で置換対象の要素が少ないとき

第2引数の$replace(置換文字列の配列)の要素数が、第1引数に指定した$pattern(正規表現配列)よりも少ない場合は、余った箇所は空文字に置換されます。
先ほどの例でいくと、下記のようになっている場合は、結果が空になります。

<?php
$text = 'apple100 banana150';

$pattern = ['/[0-9]{3}/', '/apple/', '/banana/'];
$replace = ['']; // 置換対象の要素が少ない
$result = preg_replace($pattern, $replace, $text);
echo $result; // 空文字

複数対象で正規表現配列の要素が少ないとき

逆に$replace(置換文字列の配列)の要素数の方が多い場合は、残った置換箇所は無視されます。
先ほどの例でいくと、下記のようになっている場合は、結果が「apple banana」になります。

<?php
$text = 'apple100 banana150';

$pattern = ['/[0-9]{3}/']; // 正規表現配列の要素が少ない
$replace = ['', 'apple is red. ', 'banana is yellow.'];
$result = preg_replace($pattern, $replace, $text);
echo $result; // apple banana

置換対象が配列のとき

置換対象が文字列でなく、配列の場合は、配列内の全ての要素が対象になって置換されます。
例えば、下記のような場合です。

<?php
$texts = ['apple100 banana150', 'apple apple apple', '700円のビール, 100円のapple'];
$pattern = ['/[0-9]{3}/', '/apple/', '/banana/'];
$replace = ['', 'apple is red. ', 'banana is yellow.'];

$result = preg_replace($pattern, $replace, $texts);
var_dump($result);

複数箇所を対象にしたプログラムを少し変えました。
置換対象文字列を「置換対象文字列の配列」にしています。

配列内の全ての文字列が、指定した内容で置換されて、配列として返ってきます。
上記の内容をvar_dumpで出力した結果は、下記のようになります。

array(3) {
  [0]=>
  string(32) "apple is red.  banana is yellow."
  [1]=>
  string(44) "apple is red.  apple is red.  apple is red. "
  [2]=>
  string(37) "円のビール, 円のapple is red. "
}

指定した正規表現配列が対象になって、置換対象の配列の要素が、全て置換されたことが確認できました。

strtr関数で置換する

strtr関数でも文字列を置換することが可能です。
この関数で引数を3つ渡したときには、文字列を対象にするのではなく、文字を対象にして置換します。
公式ドキュメントはこちらにあります。

例えば、下記のように使います。

<?php
$text = 'apple banana orange';
echo strtr($text, 'ano', '@N0'); // @pple b@N@N@ 0r@Nge

$text変数に置換対象文字列「apple banana orange」を代入しています。

次の行でstrtr関数を使っています。
第1引数に部分置換する文字列変数、第2引数に検索文字リスト、第3引数に置換後の文字リストを指定します。

今回は検索文字リストとして「ano」を渡しています。
これで、置換対象文字列の「a」と「n」と「o」が置換対象になります。

置換後の文字リストは、第3引数の「@N0」です。
それぞれの文字が、検索文字リストの先頭から対応しています。
そのため「aが@」、「nがN」、「oが0」に置換されます。

echoで出力内容を確認すると「@pple b@N@N@ 0r@Nge」になっていることが確認できました。

検索文字リスト・置換後文字リストの数が合わない場合は?

検索文字リストと、置換後の文字リストの数が合わない場合は、残りは無視されます。
置換後の文字リストが多い場合には、無視されて結果は変わりません。

<?php
$text = 'apple banana orange';
echo strtr($text, 'ano', '@N0ple'); // @pple b@N@N@ 0r@Nge

検索文字リストが多い場合も、無視されて結果は変わりません。

<?php
$text = 'apple banana orange';
echo strtr($text, 'anople', '@N0'); // @pple b@N@N@ 0r@Nge

置換対応の配列を使って変換する

第2引数に置換対応の配列を渡した時には、挙動が変わってきます。
このときには、文字に対応するのではなく、文字列に対応して置換されます。

$text = 'apple banana orange grape';
$trans = ['apple' => 'red', 'banana' => 'yellow', 'e' => "e!!"];
echo strtr($text, $trans); // red yellow orange!! grape!!

$text変数に置換対象の文字列「apple banana orange grape」を代入しています。

次の行で、$trans変数に置換対応の配列を代入しています。
連想配列で作っていて、キーの箇所を検索して、値で置換してくれます。
「apple」なら「red」、「banana」なら「yellow」、「e」なら「e!!」に置換します。

echoで出力して確認すると「red yellow orange!! grape!!」となりました。
置換対象の配列で、対象の文字列が置換されていることが確認できました。

コメント

タイトルとURLをコピーしました