「大文字小文字を無視して置換」ってどういうこと?
まず、やりたいことのイメージからいきます。
元の文字列: "Hello WORLD, hello world."
"hello" を "Hi" に置き換えたい。
大文字小文字を区別する置換:
→ "Hello WORLD, hello world."
(先頭の "Hello" だけ置き換わらない、など)
大文字小文字を無視した置換:
→ "Hi WORLD, Hi world."
("Hello" も "hello" も両方置き換わる)
つまり、
“hello” でも “Hello” でも “HELLO” でも、
ぜんぶ「同じもの」として扱って置換したい
というのが「大文字小文字を無視して置換」です。
ログのマスク、NGワードの置換、ブランド名の統一など、
英字を扱う場面ではかなりよく出てきます。
str_replace は「大文字小文字を区別する」
str_replace の基本
PHP の str_replace は、完全一致で置換します。
$text = "Hello WORLD, hello world.";
$result = str_replace("hello", "Hi", $text);
echo $result;
// Hello WORLD, Hi world.
PHPここでのポイントは、
"hello"という「小文字だけ」の文字列にだけ反応する"Hello"や"HELLO"は別物として扱われる
ということです。
「大文字小文字を無視して置換したい」ときに、str_replace をそのまま使うと、必ず取りこぼしが出ます。
大文字小文字を無視する専用関数:str_ireplace
str_ireplace の基本
PHP には、str_replace の「大文字小文字を無視する版」が用意されています。
それが str_ireplace です。
$text = "Hello WORLD, hello world.";
$result = str_ireplace("hello", "Hi", $text);
echo $result;
// Hi WORLD, Hi world.
PHPここでは、
"Hello""hello"
どちらも "hello" と同じものとして扱われ、
両方とも "Hi" に置き換えられています。
重要ポイント:元の大文字小文字は「保持されない」
str_ireplace は、
「マッチするときだけ大文字小文字を無視する」
「置き換え後の文字列は、指定したものをそのまま使う」
という動きをします。
つまり、
$text = "Hello HELLO hello";
$result = str_ireplace("hello", "Hi", $text);
echo $result;
// Hi Hi Hi
PHPのように、元の "Hello" / "HELLO" / "hello" の違いは失われ、
すべて "Hi" に統一されます。
「それでいい」のか「元の形を活かしたい」のかは、用途次第です。
実務でよくある使い方
NGワードをマスクする
$text = "This is a BadWord and another badword.";
$ngWord = "badword";
$masked = str_ireplace($ngWord, "******", $text);
echo $masked;
// This is a ****** and another ******.
PHPここでは、
"BadWord""badword"
どちらも "badword" として扱われ、
まとめて "******" に置き換えられます。
ブランド名の表記ゆれをそろえる
$text = "We love php, Php, and PHP!";
$normalized = str_ireplace("php", "PHP", $text);
echo $normalized;
// We love PHP, PHP, and PHP!
PHPユーザー入力や記事本文で、php / Php / PHP が混在しているときに、
ブランドとしての表記を "PHP" に統一したい、というケースです。
配列を渡して「複数キーワード」を一気に置換する
str_ireplace は配列も受け取れる
str_ireplace は、第1引数・第2引数に配列を渡せます。
$text = "Apple and GOOGLE and MicroSoft.";
$search = ["apple", "google", "microsoft"];
$replace = ["Apple", "Google", "Microsoft"];
$result = str_ireplace($search, $replace, $text);
echo $result;
// Apple and Google and Microsoft.
PHPここでのポイントは、
"Apple"/"APPLE"/"apple"→"Apple""GOOGLE"/"Google"/"google"→"Google""MicroSoft"/"MICROSOFT"/"microsoft"→"Microsoft"
というふうに、「どんな大文字小文字の組み合わせでも」、
指定した表記にそろえられることです。
ユーティリティ関数としてまとめる
単一キーワード版のラッパー
毎回 str_ireplace を直接書いてもいいのですが、
意味を分かりやすくするために、ラッパー関数にしてもよいです。
/**
* 大文字小文字を無視して置換する
*/
function replaceIgnoreCase(string $search, string $replace, string $text): string
{
return str_ireplace($search, $replace, $text);
}
PHP使い方はこうなります。
$text = "Hello WORLD, hello world.";
echo replaceIgnoreCase("hello", "Hi", $text);
// Hi WORLD, Hi world.
PHP複数キーワード版のラッパー
/**
* 大文字小文字を無視して複数キーワードを置換する
*/
function replaceManyIgnoreCase(array $search, array $replace, string $text): string
{
return str_ireplace($search, $replace, $text);
}
PHP$text = "Apple and GOOGLE and MicroSoft.";
$search = ["apple", "google", "microsoft"];
$replace = ["Apple", "Google", "Microsoft"];
echo replaceManyIgnoreCase($search, $replace, $text);
// Apple and Google and Microsoft.
PHP「何をしているか」が関数名に出るので、
呼び出し側のコードが読みやすくなります。
正規表現で大文字小文字を無視して置換する場合
preg_replace の i フラグ
preg_replace を使う場合は、
パターンの末尾に i フラグを付けると「大文字小文字を無視」できます。
$text = "Hello WORLD, hello world.";
$result = preg_replace('/hello/i', 'Hi', $text);
echo $result;
// Hi WORLD, Hi world.
PHP/hello/i の i が「ignore case(大文字小文字を無視)」の意味です。
正規表現を使うべきケース
str_ireplace で足りるなら、それが一番シンプルです。
正規表現を使うのは、例えばこんなときです。
- 「hello」だけでなく、「hello!」「hello?」もまとめて置換したい
- 「先頭の hello だけ」など、位置条件も含めたい
- 「数字3桁+hello」のような「形」を含めて置換したい
ただし、正規表現は一気に難易度が上がるので、
まずは「単純な文字列置換」は str_ireplace で済ませる、
という線引きをしておくと、コードが混乱しにくくなります。
まとめ:今日からの「大文字小文字を無視して置換」ユーティリティ
押さえておきたいポイントをコンパクトにまとめます。
str_replaceは大文字小文字を区別する。- 大文字小文字を無視して置換したいときは、
str_ireplaceを使う。 str_ireplaceは、マッチするときだけ大文字小文字を無視し、置換後の文字列は指定どおりに統一される。- 複数キーワードを一気に置換したいときは、配列を渡せる。
- 正規表現でやりたい場合は、
preg_replace('/.../i', ...)のようにiフラグを付ける。
