【PHP8.x】mb_eregi関数の使い方

作成日: 更新日:

『mb_eregi関数は、マルチバイト文字列を対象に、大文字と小文字を区別しない正規表現検索を実行する関数です。この関数は、日本語のような複数のバイトで構成される文字を含む文字列に対して、文字化けなどの問題を避けて安全にパターンマッチングを行うために設計されています。第一引数に検索したい文字列のパターンを正規表現で記述し、第二引数に検索対象の文字列を指定します。検索の結果、パターンに一致する部分が見つかった場合、その部分文字列の長さをバイト単位で返します。ただし、文字列の先頭がマッチした場合や、パターンが空文字列にマッチした場合は1を返します。一致する部分が見つからなかった場合は false を返します。オプションとして第三引数に配列変数を渡すことも可能です。その場合、パターンに一致した部分文字列が配列に格納されるため、文字列が存在するかどうかの確認だけでなく、特定の部分を抽出する目的でも利用できます。この配列の最初の要素にはパターン全体にマッチした文字列が格納されます。

基本的な使い方

構文(syntax)

<?php

$is_matched = mb_eregi(
    string $pattern,
    string $string,
    ?array &$matches = null
);

?>

引数(parameters)

string $pattern, string $string, ?array &$matches = null

  • string $pattern: 正規表現パターンを指定する文字列
  • string $string: 対象の文字列
  • ?array &$matches = null: マッチした部分を格納する配列(省略可能、参照渡し)

戻り値(return)

int|false

mb_eregi関数は、マルチバイト文字に対応した正規表現での検索を実行します。検索に成功した場合はマッチした文字列の長さを整数で返します。検索が失敗した場合はfalseを返します。

サンプルコード

PHP mb_eregiで大文字小文字を区別しない正規表現検索

<?php

// Webサーバー経由で実行した際に、文字化けを防ぎ、結果を見やすくするためのヘッダー
header('Content-Type: text/plain; charset=UTF-8');

/**
 * mb_eregi() 関数の基本的な使用例を示します。
 *
 * この関数は、大文字と小文字を区別せずに、
 * マルチバイト文字列(日本語など)に対して正規表現検索を行います。
 */
function demonstrateMbEregi(): void
{
    // 検索対象の文字列
    $string = 'PHPは WEB開発で 人気の 言語です。';
    echo "検索対象の文字列: \"{$string}\"" . PHP_EOL;
    echo '-----------------------------------------' . PHP_EOL . PHP_EOL;

    // --- 例1: マッチする場合 (マッチした部分の取得はしない) ---
    // パターン 'php' は、大文字小文字を区別しないため、元の文字列の 'PHP' にマッチします。
    $pattern1 = 'php';
    echo "1. パターン '{$pattern1}' で検索..." . PHP_EOL;

    // mb_eregi() は、マッチした場合にマッチした部分の「バイト長」を返します。
    $matchLength1 = mb_eregi($pattern1, $string);

    if ($matchLength1 !== false) {
        echo "  -> マッチしました。 (マッチ部分のバイト長: {$matchLength1})" . PHP_EOL;
    } else {
        echo "  -> マッチしませんでした。" . PHP_EOL;
    }
    echo PHP_EOL;


    // --- 例2: マッチする場合 (第3引数でマッチした部分を取得する) ---
    // パターン '(web)開発' は 'WEB開発' にマッチします。
    // カッコ()で囲んだ部分は、第3引数の配列 $matches にキャプチャ(取得)されます。
    $pattern2 = '(web)開発';
    $matches = []; // マッチ結果を格納するための配列変数
    echo "2. パターン '{$pattern2}' で検索 (マッチ部分を取得)..." . PHP_EOL;

    mb_eregi($pattern2, $string, $matches);

    if (!empty($matches)) {
        echo "  -> マッチしました。" . PHP_EOL;
        // $matches[0] には、パターン全体にマッチした文字列が格納されます。
        // $matches[1] には、1番目のカッコにマッチした文字列が格納されます。
        echo "  -> 取得した内容:" . PHP_EOL;
        print_r($matches);
    } else {
        echo "  -> マッチしませんでした。" . PHP_EOL;
    }
    echo PHP_EOL;


    // --- 例3: マッチしない場合 ---
    // このパターンは検索対象の文字列に含まれていません。
    $pattern3 = 'java';
    echo "3. パターン '{$pattern3}' で検索..." . PHP_EOL;

    // マッチしなかった場合、mb_eregi() は false を返します。
    $matchLength3 = mb_eregi($pattern3, $string);

    if ($matchLength3 === false) {
        echo "  -> マッチしませんでした。" . PHP_EOL;
    } else {
        // このブロックは実行されません
        echo "  -> マッチしました。" . PHP_EOL;
    }
}

// 関数を実行してデモンストレーションを行います
demonstrateMbEregi();

mb_eregi()関数は、日本語のようなマルチバイト文字列を対象に、正規表現を使って文字列検索を行うための関数です。この関数の特徴は、アルファベットの大文字と小文字を区別しない点です。

第1引数$patternに検索したい正規表現パターンを、第2引数$stringに検索対象の文字列を指定します。第3引数$matchesは省略可能で、配列変数を指定すると、パターンに一致した部分文字列がその配列に格納されます。

関数の戻り値は、パターンにマッチしたかどうかで異なります。マッチした場合は、マッチした部分のバイト長を数値(int型)で返します。マッチしなかった場合はfalseを返します。

サンプルコードでは、文字列「PHPは WEB開発で 人気の 言語です。」を対象に3つの検索例を示しています。1つ目の例では、パターン'php''PHP'にマッチし、そのバイト長が返されます。2つ目の例では、パターン内の()で囲んだ部分が$matches配列に格納されることを示しています。$matches[0]にはパターン全体にマッチした部分、$matches[1]以降には()でキャプチャした部分が順に格納されます。3つ目の例では、マッチしないパターンを指定したため、戻り値がfalseになることを確認できます。

mb_eregi関数は、大文字と小文字を区別せずに日本語などのマルチバイト文字列を正規表現で検索する際に使います。注意点として、この関数はマッチした場合にtrueではなく、マッチした部分のバイト長を返します。これは文字数と必ずしも一致しない点に気をつけてください。マッチしなかった場合はfalseを返すため、戻り値の判定には===!==演算子を用いた厳密な比較が推奨されます。また、この関数はPHPの内部文字エンコーディング設定に依存するため、mb_internal_encoding()であらかじめ文字コードを指定しておかないと、意図しない動作をする可能性があります。現在では、より高機能なpreg_match関数に/i修飾子を付けて同様の機能を実現する方法が一般的です。

PHP mb_eregi_replaceで大文字小文字を区別せず置換する

<?php

declare(strict_types=1);

/**
 * mb_eregi_replace を使用して、大文字小文字を区別せずに文字列を置換するサンプル
 *
 * この関数は、与えられたテキスト内の特定の単語("cat" や "dog")を、
 * 大文字・小文字に関わらず、指定した絵文字に置き換えます。
 *
 * @param string $text 処理対象のテキスト
 * @return string 置換後のテキスト
 */
function replaceAnimalWords(string $text): string
{
    // マルチバイト文字列の正規表現関数で使用する文字エンコーディングを設定
    mb_regex_encoding('UTF-8');

    // 最初の置換: "cat" (大文字小文字問わず) を "🐱" に置換
    // mb_eregi_replace は大文字小文字を区別しない正規表現置換を行います。
    $patternCat = 'cat';
    $replacementCat = '🐱';
    $text = mb_eregi_replace($patternCat, $replacementCat, $text);

    // 次の置換: "dog" (大文字小文字問わず) を "🐶" に置換
    $patternDog = 'dog';
    $replacementDog = '🐶';
    $text = mb_eregi_replace($patternDog, $replacementDog, $text);

    // mb_eregi_replace はエラー時に false を返す可能性があるため、
    // 確実に文字列を返すようにします。
    return $text ?: '';
}

// サンプルとなる文字列
$originalString = 'My favorite animals are Cat, dog, and CAT. The Dog is cute.';

// 関数を呼び出して文字列を置換
$replacedString = replaceAnimalWords($originalString);

// 結果を出力
echo 'Original: ' . $originalString . PHP_EOL;
echo 'Replaced: ' . $replacedString . PHP_EOL;

?>

このPHPコードは、mb_eregi_replace関数を使用して、大文字と小文字の違いを無視して文字列を置き換える方法を示しています。この関数は、日本語のようなマルチバイト文字列に対応した正規表現置換を行うためのものです。

mb_eregi_replace関数は3つの主要な引数を取ります。第1引数には検索したい文字列パターン、第2引数には置き換えたい文字列、そして第3引数には処理対象となる元の文字列を指定します。この関数の大きな特徴は、第1引数で指定したパターンに一致する部分を、大文字・小文字を区別することなく検索して置換する点です。

サンプルコード内のreplaceAnimalWords関数では、まずmb_regex_encoding関数で文字エンコーディングを「UTF-8」に設定しています。これは、文字化けを防ぎ、日本語などのマルチバイト文字を正しく扱うために重要です。その後、mb_eregi_replaceを2回使用し、1回目で文字列内の'cat'('Cat'や'CAT'も含む)を絵文字'🐱'に、2回目で'dog'('Dog'も含む)を'🐶'に置き換えています。

関数の戻り値は、置換が成功した場合は置換後の文字列、エラーが発生した場合はfalseとなります。このコードを実行すると、元の文章に含まれていた複数の'cat'や'dog'が、大文字・小文字に関わらずすべて対応する絵文字に置換された結果が出力されます。

このコードを利用する際は、まずmb_regex_encoding()で文字エンコーディングを正しく設定することが重要です。この設定を忘れると、文字化けや意図しない動作の原因となります。また、mb_eregi_replaceは大文字小文字を区別しない便利な関数ですが、より高機能で一般的に利用されるpreg_replace()関数でも/i修飾子を使えば同様の処理が実現できます。preg_replace()は配列を用いて複数のパターンと置換文字列を一度に指定できるため、サンプルコードのように関数を複数回呼び出すよりも効率的です。パターンに正規表現の特殊文字が含まれると意図しない置換が起きるため注意しましょう。エラー時にfalseを返す可能性も考慮し、戻り値が常に文字列となるよう処理しておくとより安全です。

【PHP8.x】mb_eregi関数の使い方 | いっしー@Webエンジニア