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

作成日: 更新日:

mb_ereg_replace関数は、マルチバイト文字列に対して正規表現による検索と置換を実行する関数です。日本語のような2バイト以上の文字を含む文字列を正しく扱うことができるため、文字化けのリスクを避けながら高度な文字列操作を行えます。この関数は、第1引数に検索したい文字列のパターンを正規表現で指定し、第2引数にマッチした部分を置き換えるための文字列、そして第3引数に処理対象となる文字列を渡します。置換文字列の中では、\1\2といった後方参照を利用することで、パターン内で丸括弧()を使ってキャプチャした部分文字列を埋め込むことが可能です。これにより、単なる固定文字列への置換だけでなく、抽出した文字列の一部を再利用するような動的な置換が実現できます。また、第4引数で検索オプションを指定することもでき、例えばiを指定すると大文字と小文字を区別せずに検索します。処理が成功すると置換後の文字列を返し、パターンに一致する箇所がなかった場合は元の文字列をそのまま返します。

基本的な使い方

構文(syntax)

mb_ereg_replace(string $pattern, string $replacement, string $string, ?string $options = null): string|false|null

引数(parameters)

string|array $pattern, string|array|callable $replacement, string|array $string, ?string $options = null

  • string|array $pattern: 置換対象の正規表現パターン。文字列または文字列の配列を指定できます。
  • string|array|callable $replacement: 置換後の文字列。文字列、文字列の配列、またはコールバック関数を指定できます。
  • string|array $string: 置換処理を行う対象の文字列または文字列の配列。
  • ?string $options = null: オプションを指定する文字列。省略可能です。

戻り値(return)

string|false|null

mb_ereg_replace関数は、マルチバイト文字に対応した正規表現による文字列置換を行い、置換後の文字列を返します。置換に失敗した場合はfalseを、引数patternにnullが渡された場合はnullを返します。

サンプルコード

mb_ereg_replaceで日本語氏名を変換する

<?php

/**
 * 日本語の氏名を「姓 名」から「名, 姓 様」の形式に変換します。
 *
 * この関数は、マルチバイト文字列に対応した正規表現置換関数 mb_ereg_replace を使用して、
 * 日本語の氏名のフォーマットを変更する例を示します。
 * PHP 7.4 環境でも問題なく動作します。
 *
 * @param string $fullName 「姓 名」形式の氏名。
 * @return string|false|null 変換後の文字列。置換に失敗した場合は false または null が返る可能性があります。
 */
function formatJapaneseName(string $fullName): string|false|null
{
    // mb_ereg_replace を使用する際は、内部エンコーディングを正しく設定することが重要です。
    mb_internal_encoding("UTF-8");

    // 検索パターンを定義します。
    // '(.+) (.+)' は「(任意の1文字以上の文字列) (スペース) (任意の1文字以上の文字列)」にマッチします。
    // カッコ () で囲んだ部分は後方参照としてキャプチャされます。
    // 最初のカッコが \1、次のカッコが \2 に対応します。
    $pattern = '(.+) (.+)';

    // 置換後の文字列を定義します。
    // '\2, \1 様' は「(2番目にキャプチャした文字列), (1番目にキャプチャした文字列) 様」を意味します。
    // これにより、姓と名を入れ替えます。
    $replacement = '\2, \1 様';

    // mb_ereg_replace を実行して文字列を置換します。
    return mb_ereg_replace($pattern, $replacement, $fullName);
}

// --- 実行例 ---

// 元の氏名
$originalName = '山田 太郎';

// 関数を呼び出して氏名のフォーマットを変換
$formattedName = formatJapaneseName($originalName);

// 結果を出力
echo "元の氏名: " . $originalName . PHP_EOL;
echo "変換後の氏名: " . $formattedName . PHP_EOL;

?>

このPHPサンプルコードは、日本語のようなマルチバイト文字列に対応した正規表現を使い、文字列を検索して置換するmb_ereg_replace関数の使用例です。具体的には、「姓 名」という形式の氏名を「名, 姓 様」の形式へ変換します。このコードはPHP 7.4環境でも問題なく動作します。

mb_ereg_replace関数は主に3つの引数を取ります。第1引数の$patternには、検索する文字列のパターンを正規表現で指定します。サンプルでは'(.+) (.+)'とし、スペースで区切られた2つの文字列を検出します。ここで丸括弧()で囲んだ部分は、後で置換文字列の中から参照できるよう記憶されます。

第2引数の$replacementには、パターンに一致した部分を置き換える文字列を指定します。'\2, \1 様'のように記述することで、$patternで記憶した1番目と2番目の文字列を入れ替えて出力できます。

第3引数の$stringには、処理対象となる元の文字列を渡します。

この関数は、置換が成功すると新しい文字列を返り値として返します。パターンに一致する文字列が見つからなかった場合や、処理に失敗した場合はfalseまたはnullが返されることがあります。日本語を正しく扱うためには、事前にmb_internal_encoding()で文字エンコーディングを指定しておくことが重要です。

mb_ereg_replace関数を日本語のようなマルチバイト文字で利用する際は、事前にmb_internal_encodingで文字エンコーディングを「UTF-8」などに正しく設定することが不可欠です。この設定がないと文字化けや予期せぬ動作の原因となります。正規表現パターン内の丸カッコ()は、一致した文字列を記憶する役割を持ちます。置換文字列内の\1\2は、それぞれパターン内の1番目、2番目の丸カッコが記憶した文字列に対応しており、これを後方参照と呼びます。また、この関数はパターンに一致しなかったり、エラーが発生したりするとnullfalseを返す可能性があります。そのため、戻り値を安全に利用するには、文字列が返ってきたかを事前に確認することが推奨されます。

mb_ereg_replaceで日本語数字を置換する

<?php

/**
 * mb_ereg_replace を使用して日本語文字列内の数字を置換するサンプル関数
 *
 * この関数は、マルチバイト文字(全角文字など)を含む文字列の中から、
 * 正規表現にマッチする部分を探し、指定された文字列に置き換える例を示します。
 */
function replaceNumbersInJapaneseText(): void
{
    // スクリプトの内部文字エンコーディングをUTF-8に設定します。
    // これにより、日本語などのマルチバイト文字を正しく扱うことができます。
    mb_internal_encoding('UTF-8');

    // 置換対象の文字列 (半角と全角の数字が混在)
    $text = '商品Aの価格は1,500円、商品Bは3000円です。';

    // 検索する正規表現パターン
    // '[0-90-9,,]+' は、半角数字(0-9)・全角数字(0-9)・コンマ(,)・全角コンマ(,)
    // のいずれかが1回以上続く文字列にマッチします。
    $pattern = '[0-90-9,,]+';

    // 置換後の文字列
    // '\0' は「後方参照」と呼ばれ、パターンにマッチした文字列全体を指します。
    // ここでは、マッチした数字部分を <price> タグで囲みます。
    $replacement = '<price>\0</price>';

    // 検索オプション (今回は使用しないため null を指定)
    // 例: 'i' を指定すると大文字と小文字を区別しなくなります。
    $options = null;

    // mb_ereg_replace関数を実行して置換処理を行う
    $result = mb_ereg_replace($pattern, $replacement, $text, $options);

    // 元の文字列と置換後の文字列を出力して結果を確認する
    echo '元の文字列: ' . $text . PHP_EOL;
    echo '置換後の文字列: ' . $result . PHP_EOL;
}

// 作成した関数を実行します
replaceNumbersInJapaneseText();

?>

mb_ereg_replace関数は、日本語のようなマルチバイト文字を含む文字列に対して、正規表現を利用して文字列の検索と置換を行う関数です。このサンプルコードは、半角数字と全角数字が混在する日本語の文章の中から、価格を表す数値部分を検出し、<price>というHTMLタグで囲む処理を示しています。

この関数は主に4つの情報(引数)を受け取ります。第1引数の$patternには、どのような文字列を探すかのルールを正規表現で指定します。ここでは「半角または全角の数字とコンマが1文字以上続く部分」というルールが設定されています。第2引数の$replacementには、見つかった部分を何に置き換えるかを指定します。サンプルでは\0という特殊な記述で「見つかった文字列そのもの」を参照し、その前後をタグで囲んでいます。第3引数の$stringには、処理対象となる元の文章を渡します。第4引数の$optionsは検索の挙動を調整するオプションですが、この例では使用していません。

これらの引数をもとに、関数は置換処理を実行し、結果として新しい文字列を返します。これを戻り値と呼びます。処理に失敗した場合はfalseが返されることもあります。サンプルでは、この戻り値を出力することで、数字部分だけが正しくタグで囲まれたことを確認できます。なお、mb_internal_encoding関数で文字コードをあらかじめ指定しておくことで、文字化けを防ぎ日本語を正しく扱えるようになります。

mb_internal_encodingの設定は、日本語のようなマルチバイト文字を正しく処理するために非常に重要です。この設定がないと文字化けや意図しない動作の原因となるため、必ずスクリプトの冒頭で記述してください。

mb_ereg_replace関数はPOSIX拡張正規表現を使用します。Perl互換正規表現(PCRE)を用いるmb_preg_replace関数とは正規表現の文法や後方参照の記述が異なるため、混同しないよう注意が必要です。特に、サンプルコードの後方参照\0は、マッチした部分全体を指すereg系の特徴です。

本関数は失敗した場合にfalseを返すことがあります。そのため、置換結果を利用する前には、戻り値がfalseでないか確認することで、予期せぬエラーを防ぎ、より堅牢なコードになります。必要に応じて$options引数で正規表現の振る舞いを調整してください。

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