PHP Tips | 文字列処理:検索・置換 – 大文字小文字を無視して置換

PHP PHP
スポンサーリンク

「大文字小文字を無視して置換」ってどういうこと?

まず、やりたいことのイメージからいきます。

元の文字列: "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/ii が「ignore case(大文字小文字を無視)」の意味です。

正規表現を使うべきケース

str_ireplace で足りるなら、それが一番シンプルです。
正規表現を使うのは、例えばこんなときです。

  • 「hello」だけでなく、「hello!」「hello?」もまとめて置換したい
  • 「先頭の hello だけ」など、位置条件も含めたい
  • 「数字3桁+hello」のような「形」を含めて置換したい

ただし、正規表現は一気に難易度が上がるので、
まずは「単純な文字列置換」は str_ireplace で済ませる、
という線引きをしておくと、コードが混乱しにくくなります。


まとめ:今日からの「大文字小文字を無視して置換」ユーティリティ

押さえておきたいポイントをコンパクトにまとめます。

  • str_replace は大文字小文字を区別する。
  • 大文字小文字を無視して置換したいときは、str_ireplace を使う。
  • str_ireplace は、マッチするときだけ大文字小文字を無視し、置換後の文字列は指定どおりに統一される。
  • 複数キーワードを一気に置換したいときは、配列を渡せる。
  • 正規表現でやりたい場合は、preg_replace('/.../i', ...) のように i フラグを付ける。

タイトルとURLをコピーしました