PHPの文字列置換関数はどれを使う?

PHPにはいろんな文字列置換関数があるようだ*1。整理してみる。

  1. string str_replace(置換前の文字列, 置換後の文字列, 検索する文字列)
  2. string str_ireplace(置換前の文字列, 置換後の文字列, 検索する文字列)
  3. string preg_replace(置換前の文字列, 置換後の文字列(正規表現), 検索する文字列)

どれも文字列の置換を行うが、1.はアルファベットの大小を区別し、2.は区別しない。

ファイル名:testReplace.php

<?php
// 'GANGSTAR NUMBER 1'という文字列に対して、
$before       = 'GANGSTAR NUMBAR 1';
// 'AR'を'ER'に置換
$target1      = 'AR';
$replacement1 = 'ER';
// 'gang'を'POP'に置換
$target2      = 'gang';
$replacement2 = 'POP';

$after1 = str_replace($target1, $replacement1, $before);
echo '置換1: ' . $after1 . "\n";
$after2 = str_replace($target2, $replacement2, $after1);
echo '置換2: ' . $after2 . "\n";

というコードを実行すると、

$ php testReplace.php
置換1: GANGSTER NUMBER 1
置換2: GANGSTER NUMBER 1

と出力され、大文字、小文字が区別されるが、

ファイル名:testReplace2.php

<?php
// 'GANGSTAR NUMBER 1'という文字列に対して、
$before       = 'GANGSTAR NUMBAR 1';
// 'AR'を'ER'に置換
$target1      = 'AR';
$replacement1 = 'ER';
// 'gang'を'POP'に置換
$target2      = 'gang';
$replacement2 = 'POP';

$after1 = str_ireplace($target1, $replacement1, $before);
echo '置換1: ' . $after1 . "\n";
$after2 = str_ireplace($target2, $replacement2, $after1);
echo '置換2: ' . $after2 . "\n";

というコードを実行すると、

$ php testReplace2.php
置換1: GANGSTER NUMBER 1
置換2: POPSTER NUMBER 1

と、小文字でもマッチして置換してくれる。

また、正規表現を使いたい場合は、preg_replace()を使うのが高速らしい。

ファイル名:testReplace3.php

<?php
// 'GANGSTAR NUMBER 1'という文字列に対して、
$before       = 'GANGSTAR NUMBAR 1';
// 'ANGSTA'を'EEGE'に置換
$target1      = '/A.*?A/';
$replacement1 = 'EEGE';
// 'NUMBER 1'を'No.1'に置換
$target2      = '/n.*$/';
$replacement2 = 'No.1';
// 'NUMBER 1'を'No.1'に置換(大小文字を区別しない)
$target3      = '/n.*$/i';
$replacement3 = 'No.1';

$after1 = preg_replace($target1, $replacement1, $before);
echo '置換1: ' . $after1 . "\n";
$after2 = preg_replace($target2, $replacement2, $after1);
echo '置換2: ' . $after2 . "\n";
$after3 = preg_replace($target3, $replacement3, $after2);
echo '置換3: ' . $after3 . "\n";

というコードを実行すると、

$ php testReplace3.php
置換1: GEEGER NUMBER 1
置換2: GEEGER NUMBER 1
置換3: GEEGER No.1

置換2は大小文字を区別するため置換が行われないが、置換3で、target文字列に'i'スイッチをつけると大小文字を区別する。これはPerlなどでも使用する、通常の正規表現記述だ。

*1:次が詳しい- File Not Found -