str_replace()をはじめとする、PHPで文字列を置換する際に使う関数の基本的な使い方の紹介です。動的なデータの操作やソースコードの整形等に利用でき、WordPressのカスタマイズにも応用できます。
substr_replace()やpreg_replace()と併せて、必要に応じて使い分けられると便利です。
PHPで文字列を置換する方法
いくつかの代表的な関数がある
文字列を置換するためのPHPの関数はいくつかあり、どれを使えばいいのか迷ってしまいます。
今回は文字列置換を行うための代表的な関数であるstr_replace()
とsubstr_replace()
、preg_replace()
を紹介します。
関数の選び方
それぞれの特徴は、シンプルで軽快なstr_replace()
とsubstr_replace()
、万能なpreg_replace()
といった感じです。そのため、まずはstr_replace()
又はsubstr_replace()
を検討し、これらでは対応できない場合にpreg_replace()
を使うと良いと思います。
str_replace() 【文字列を文字列に置換 ※日本語OK】
str_replace()の使い方
書式
str_replace( $search, $replace, $subject, $count );
対象となる文字列もしくは配列に含まれる文字列を指定して置換します。$subject
に含まれる$search
を全て$replace
に置換します。$count(省略可)
がある場合は置換回数が格納されます。日本語(マルチバイト文字)にも対応しています。
str_replace()での置換例
基本的な置換
3行目ではテキストを置換(マンガ→小説)、6行目ではHTMLタグを置換(p→h1)しています。'p>', 'h1>'
のように指定することで閉じタグも置換対象となるようにしています。
サンプルコード
$subject = '<p>今日はマンガを読みました。</p>'; // 対象となるテキスト $str = str_replace( 'マンガ', '小説', $subject ); // 該当する文字列を置換 echo $str . "\n"; // 置換したものを書き出し $str = str_replace( 'p>', 'h1>', $subject ); // 該当する文字列を置換 echo $str . "\n"; // 置換したものを書き出し
実行結果
<p>今日は小説を読みました。</p> <h1>今日はマンガを読みました。</h1>
配列を配列で置換
検索文字列と置き換える文字列を配列にした場合の例になります。配列の並び順にそれぞれ置換されるため、次の例では「今日→昨日」、「マンガ→小説」と処理されます。
サンプルコード
$subject = '<p>今日はマンガを読みました。</p>'; $str = str_replace( array( '今日', 'マンガ' ), array( '昨日', '小説' ), $subject ); echo $str . "\n";
実行結果
<p>昨日は小説を読みました。</p>
配列と1つの文字列で置換
複数の検索文字列に対して置き換える文字列が1つの場合、それぞれが置き換える文字列に置換されます。次の例では3つの文字列がそれぞれ空に置換されています。
サンプルコード
$subject = '<p>今日はマンガを読みました。</p>'; echo str_replace( array( 'は', 'を', 'みました' ), '', $subject );
実行結果
<p>今日マンガ読。</p>
置き換える文字列に""
(空)を指定すると検索文字列を削除するのと同じことになります。
数の異なる配列で置換
検索文字列の数に対して置き換える文字列が少ない場合、足りない部分は空として扱われます。次のように検索文字列3つに対して置き換える文字列が2つの例では「今日→明日」、「マンガ→休み」、「を読みました→空」と置換されます。
サンプルコード
$subject = '<p>今日はマンガを読みました。</p>'; echo str_replace( array( '今日', 'マンガ', 'を読みました' ), array( '明日', '休み' ), $subject );
実行結果
<p>明日は休み。</p>
WordPressでの活用例
以前の記事ではstr_replace()
を使ってWordPressが書き出すデフォルトのクラス名を任意のものに書き換えました。
substr_replace() 【指定範囲を置換 ※日本語不可】
substr_replace()の使い方
書式
substr_replace( $string, $replace, $offset, $length );
対象の文字列の指定範囲を置換します。
対象文字列$string
の置換開始位置$offset
と置換範囲$length(省略可)
を指定し$replace
に置換します。$length
を省略した場合は開始位置から最後までとなります。
開始位置は0から始まるインデックスで指定するため、0を指定した場合は1文字目となります。
※ 日本語(マルチバイト文字)の場合は非対応のためpreg_replace()
を使います。
substr_replace()での置換例
サンプルコード
$string = 'NIKE AIR JORDAN LOW'; // 対象となる文字列 $str = substr_replace( $string, 'DUNK', 5 ); // 対象の指定範囲を置換 echo $str . "\n"; // 置換したものを書き出し $str = substr_replace( $string, 'DUNK', 5, 10 ); // 対象の指定範囲を置換 echo $str . "\n"; // 置換したものを書き出し
3行目は文字列$string
のインデックスが5の位置(0から数えるので実際には6文字目のA)以降を「DUNK」に置換しています。
6行目では開始位置は同じですが置換範囲10文字の指定があるの、11文字目以降はそのまま残ります。
従って次のような実行結果になります。
実行結果
NIKE DUNK NIKE DUNK LOW
preg_replace() 【正規表現で指定して置換 日本語OK】
preg_replace()の使い方
書式
preg_replace( $pattern, $replacement, $subject );
対象文字列を正規表現で検索して置換します。
対象文字列$subject
を正規表現$pattern
で検索して$replacement
に置換します。
これまでの2つの関数、str_replace()
, substr_replace()
では対応できない詳細な検索が必要な場合に使います。検索対象の文字数が少ない場合はstr_replace()
で間に合うことが多いです。
preg_replace()の使用例
次の例文$subject
の価格の箇所を置換してHTMLタグを追加してみます。
数値が012と14800の2か所ありますが正規表現で価格の数値のみ該当するようにします。
※ 今回は説明のためカンマ無しの表記にしています。
単純な置換
サンプルコード
$subject = '<p>品番012のスニーカーは14800円です。</p>'; $pattern = "/\d+円/u"; $replacement = '<strong>14800円</strong>'; $str = preg_replace( $pattern, $replacement, $subject ); echo $str;
2行目の/\d+円/u
の部分が正規表現です。
今回は「直後に”円”の付く1つ以上の数字」という指定をしています。
該当箇所が$replacement
に置換されるので実行結果は次のようになります。
実行結果
<p>品番012のスニーカーは<strong>14800円</strong>です。</p>
この方法には問題があり、対象文字列に異なる価格があった場合にこの方法では全てが14800円に置換されてしまいます。異なる価格にも対応するためには次のようなサブパターンを使う等、正規表現の記述を工夫する必要があります。
サブパターンで文字列を流用する
正規表現の一部を( )
で括るとサブパターンとなり、出現順に$1
、$2
、$3
と表すことができます。
サンプルコード
$subject = '<p>品番012のスニーカーは14800円、品番013は19800円です。</p>'; $pattern = "/(\d+円)/u"; $replacement = '<strong>$1</strong>'; $str = preg_replace( $pattern, $replacement, $subject ); echo $str;
上の例では14800円
、19800円
の2か所が正規表現に該当しています。\d+円
を( )
で括ることでサブパターンとなり、置換文字列$replacement
に$1
と書くことで元の文字列がそのまま流用されます。
実行すると14800円、19800円の部分はそのままに、<strong>
タグのみが追加されているのが分かります。
実行結果
<p>品番012のスニーカーは<strong>14800円</strong>、品番013は<strong>19800円</strong>です。</p>
参考リンク
php.net – str_replace()
php.net – substr_replace()
php.net – preg_replace()