PHPで文字列を置換したい!正規表現を使った関数の特徴や使い方を解説!

この記事の要点

  • PHPの文字列置換はstr_replace / str_ireplace / substr_replace / strtr / preg_replace / mb_ereg_replaceがある
  • よく使われるのはstr_replaceとsubstr_replace
  • 複雑な文字列の検索・置換にはpreg_replaceを使う

以前、PHPの仕組みや学習方法についてご紹介していました。

【初心者でも副業可能!】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の配列については、基本的な使い方や種類、応用まで解説しているこちらの記事を参考にしてください。

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つ渡すことができますが、場合によっては意図しない挙動になることがあるため、使用する際には注意が必要です。

引数3つ:string strtr(string $string, string $from, string $to)
引数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の詳しい使い方に関しては、こちらの記事を参照してください。

初心者でも簡単!PHP正規表現の基本と早見表・チェックツールを紹介

mb_ereg_replaceで正規表現の置換をしてみよう

mb_ereg_replaceは、マルチバイト文字列を正規表現で置換する関数です。

マルチバイト文字列とは:

マルチバイト文字とは、コンピュータで文字を扱えるよう各文字に番号を対応付ける文字コードや文字セットのうち、一文字を2バイト以上のデータ量で表すもの。また、そのようなコード体系によって表される文字。

引用:IT用語辞典e-Words

基本的な使い方は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フレームワーク」についてこちらの記事で解説していますので、参考にしてください。

2022年最新のPHPフレームワークベスト10【初心者におすすめも紹介】