この記事の要点
- PHPの文字列置換はstr_replace / str_ireplace / substr_replace / strtr / preg_replace / mb_ereg_replaceがある
- よく使われるのはstr_replaceとsubstr_replace
- 複雑な文字列の検索・置換にはpreg_replaceを使う
以前、PHPの仕組みや学習方法についてご紹介していました。
今回は、PHPで文字列を置換する方法と、正規表現を使った関数の特徴や使い方を解説します。
PHPでは、文字列置換のために6つの関数が用意されています。
- str_replace
- str_ireplace
- substr_replace
- strtr
- preg_replace
- mb_ereg_replace
この記事では、PHPで文字列置換する関数の使い方や、正規表現を使った文字列の置換について解説します。
目次
PHPで文字列置換をする関数は6種類
PHPでは、文字列を置換するために以下の6つの関数が用意されており、よく使われるのは、処理が軽いstr_replaceとsubstr_replaceです。
これらでは対応できない場合には、正規表現による置換ができるpreg_replaceを利用します。
str_ireplaceは大文字・小文字を分けずに検索・置換を行う関数です。
PHPのコードは基本的に大文字・小文字を分けて書かれるので、あまり利用することはないかもしれません。
strtrはシングルバイトの文字列置換を行う関数です。mb_ereg_replaceはpreg_replaceと同じく正規表現による置換を行う関数ですが、マルチバイト文字列に対応しています。
str_replaceで文字列を置換してみよう
シンプルで処理の軽いstr_replaceは、文字列置換で最もよく使われる関数です。
PHPマニュアルには、
(正規表現のような) 技巧的な置換ルールを必要としない場合、 preg_replace() の代わりにこの関数を使うべきです。
とあり、文字列置換は基本的にstr_replaceを使用することが推奨されています。
引数には文字列・配列ともに利用できるため、それぞれの動きについて見ていきましょう。
なお、例では英語を用いていますが、str_replaceは日本語も変換することができます。
文字列の置換
次の例は、文字列を文字列に置換しています。
例:
//置換前文字列 $subject = "So many men, so many minds."; //置換 $replace = str_replace("many", "little", $subject); //出力 echo $replace;
実行結果:
So little men, so little minds.
このように、str_replaceは対象の文字列をすべて置換する性質を持っています。
配列も置換できる
次の例では、配列に含まれるすべての文字列を一括置換しています。
例:
//置換前文字列 $subject = "It is no use crying over spilt milk."; //置換 $replace = str_replace(["no", "over", "milk"], "*", $subject); //出力 echo $replace;
実行結果:
It is * use crying * spilt *.
配列に含まれる要素「no」「over」「milk」がすべて「*」に置換されました。
PHPの配列については、基本的な使い方や種類、応用まで解説しているこちらの記事を参考にしてください。
配列を配列で置換する①
配列を配列で置換することもできます。次の例を見てください。
例: //置換前文字列 $subject = "The early bird catches the worm."; //置換 $replace = str_replace(["bird", "worm"], ["rabbit", "snake"], $subject); //出力 echo $replace; 実行結果: The early rabbit catches the snake.
配列に入っている要素がそれぞれ置換に対応しているので、bird→rabbit、worm→snakeに置換されます。
配列を配列で置換する②
配列を配列で置換する場合で、配列の要素の数が合わない場合も見ておきましょう。
例:
//置換前文字列 $subject = "After the storm comes a calm. "; //置換 $replace = str_replace(["After", "storm", "calm"], ["Before", "typhoon"], $subject); //出力 echo $replace;
実行結果:
Before the typhoon comes a .
配列のうち、初めの2つはそれぞれ対応した文字列に置換されます。
最後の「calm」には対応する要素がないため、置換する文字列は空文字とみなされます。
置換した回数を取得できる
str_replaceに第4引数を設定すると、置換した回数が格納されます。
例:
//置換前文字列 $subject = "So many men, so many minds"; //置換 $replace = str_replace(["so", "many"], "little", $subject, $count); //結果出力 echo $replace."<br>"; echo "count=".$count;
実行結果:
So little men, little little minds. 3
str_replaceは大文字と小文字を分けるため、最初の「So」は置換されません。
そのため、置換の回数は3回となります。
str_ireplaceで文字列を置換してみよう
str_ireplaceは、大文字・小文字を区別せずに文字列置換を行います。
大文字・小文字を区別しないところ以外はstr_replaceと同じです。
例:
//置換前文字列 $subject = "Better to ask the way than go astray."; //置換 $replace = str_replace("ASK", "think", $subject); //出力 echo $replace;
実行結果:
Better to think the way than go astray.
置換対象文字列は「ASK」と大文字に指定されていますが、実際には小文字の「ask」が置換されています。
substr_replaceで文字列を置換してみよう
substr_replaceは、指定した範囲内の文字列を置換します。
str_replaceとの大きな違いは、日本語を変換できない点です。
範囲指定の方法を見ていきましょう。
例:
//置換前文字列 $subject = "Bad news travels fast."; //置換 $replace1 = substr_replace($subject, "rumor", 4); $replace2 = substr_replace($subject, "rumor", 4, 4 ); //出力 echo $replace1."<br>"; echo $replace2."<br>";
実行結果:
Bad rumor Bad rumor travels fast.
substr_replaceの第3引数が、置換対象範囲の開始位置です。
開始位置は「0番目」から始まる点に注意しましょう。
第4引数には、置換対象範囲の開始位置からの文字数を指定します。
省略された場合、対象文字列の最後までとなります。
strtrで文字列を置換してみよう
strtrは、文字列を文字列または配列によって置換する関数です。
引数は3つ、あるいは2つ渡すことができますが、場合によっては意図しない挙動になることがあるため、使用する際には注意が必要です。
引数2つ:string strtr(string $string, array $replace_pair)
引数が3つの場合
引数が3つの場合で、置換前文字列と置換後文字列がシングルバイトであれば、str_replaceと同じ挙動をします。
例:
//置換文字列 $subject = “Seeing is believing.”; //置換 $replace = strtr ($subject, ‘e’, ‘a’); //出力 echo $replace;
実行結果:
Saaing is baliaving.
上の例では、置換対象文字列のうち「e」がすべて「a」に置換されました。
しかし、同じく引数が3つの場合でも、置換前文字列と置換後文字列がシングルバイトより長ければ、str_replaceとは異なる挙動をします。
例:
//置換文字列 $subject = “Seeing is believing.”; //置換 $replace = strtr ($subject, ‘is’, ‘ha’); //出力 echo $replace;
実行結果:
Seehng ha belhevhng.
想定では「Seeing ha believing」となるはずが、全く異なる文字列になりました。
strtrで引数が3つの場合、$fromに対応する$toのシングルバイトが変換されます。
例で言うと、「is」→「ha」に変換されるのではなく、「i」→「h」、「s」→「a」に変換されるということになります。
$fromと$toに指定する文字列は同じ長さにする必要がありますが、もし長さが異なる場合、長い部分は無視されます。
引数が2つの場合
文字列をシングルバイトでなく固まりで置換したい場合は、strtrに引数を2つ渡すことで実現できます。
例:
//置換文字列 $subject = “A word is enough to the wise.”; //置換 $replace = strtr ($subject, [“word” => “sword”, “to” => “through”]); //出力 echo $replace;
実行結果:
A sword is enough through the wise.
「word」「to」が単語として置換されました。
この結果は、str_replaceを使用した場合と同様のものになります。
preg_replaceで正規表現の置換をしてみよう
preg_replaceは、正規表現によって文字列置換を行う関数です。
str_replaceやsubstr_replaceでは検索できない複雑な形式、たとえば電話番号やメールアドレスといったフォーマットを置換することができます。
例:
//置換前文字列 $subject = "There is no royal road to learning."; //置換 $replace = preg_replace('/royal/', 'regal', $subject); //出力 echo $replace;
実行結果:
There is no regal road to learning.
正規表現やpreg_replaceの詳しい使い方に関しては、こちらの記事を参照してください。
mb_ereg_replaceで正規表現の置換をしてみよう
mb_ereg_replaceは、マルチバイト文字列を正規表現で置換する関数です。
マルチバイト文字列とは:
マルチバイト文字とは、コンピュータで文字を扱えるよう各文字に番号を対応付ける文字コードや文字セットのうち、一文字を2バイト以上のデータ量で表すもの。また、そのようなコード体系によって表される文字。
基本的な使い方はpreg_replaceとほぼ同じですが、1点だけ異なる部分があります。
それは、mb_ereg_replaceで指定する正規表現にはセパレータを必要としない点です。
例:
//置換前文字列 $subject = "おはようございます。"; //置換 $replace = preg_replace('ます。', 'ません!', $subject); //出力 echo $replace;
実行結果:
おはようございません!
preg_replaceの第一引数には正規表現パターンを指定しますが、セパレータがついていないのがわかります。
なお、同様の表現をpreg_replaceで記述する場合、
preg_replace('/ます。/u', 'ません!', $subject);
と記載します。
わずかな違いのため気づきにくい部分ですが、利用する際には注意が必要です。
まとめ
PHPの文字列置換は、実際のシステム開発でもよく使われる機能です。
今回は6つの関数をご紹介しましたが、それぞれの違いをしっかりと理解しておきましょう。
特にstr_replaceとpreg_replaceは汎用性の高いものなので、必要に応じて使いこなせるようになると大変便利です。
また、初心者プログラマーでも学習しやすいPHPですが、PHPフレームワークを使えるようになれば、受注できる仕事が広がるメリットがあります。
PHPでアプリケーション開発をするための枠組みのである「PHPフレームワーク」についてこちらの記事で解説していますので、参考にしてください。