Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】mb_ereg()関数の使い方

mb_ereg関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

mb_ereg関数は、マルチバイト文字列を対象として正規表現によるパターンマッチングを実行する関数です。この関数は、第1引数で指定された正規表現パターンが、第2引数の検索対象文字列内に存在するかどうかを検査します。パターンがマッチした場合は true を、マッチしなかった場合は false を返します。オプションとして第3引数に配列変数を渡すことで、マッチした部分文字列を取得できます。この場合、配列の最初の要素にはパターン全体にマッチした文字列が、2番目以降の要素にはパターン内の丸括弧でキャプチャされた部分文字列が順番に格納されます。この関数の正規表現の評価は、mb_regex_encoding関数などで設定された内部文字エンコーディングに基づいて行われるため、日本語のようなマルチバイト文字を1文字として正しく扱うことが可能です。この検索では大文字と小文字が区別されます。大文字と小文字を区別しない検索を行いたい場合は、代わりにmb_eregi関数を使用してください。

構文(syntax)

1<?php
2$pattern = "[0-9]+";
3$string = "今日の気温は25度です。";
4$matches = [];
5
6mb_ereg($pattern, $string, $matches);
7?>

引数(parameters)

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

  • string $pattern: マッチングに使用する正規表現パターンを指定する文字列
  • string $string: パターンにマッチングさせる対象の文字列
  • ?array &$matches = null: マッチした部分文字列を格納する配列。省略可能で、省略した場合はマッチ結果は返されません。

戻り値(return)

int|bool

正規表現にマッチした場合、マッチした文字列の数(0以上の整数)を返します。マッチしなかった場合は false を返します。

サンプルコード

PHP mb_ereg_replace で全角スペースを置換する

1<?php
2
3/**
4 * 日本語の全角スペースを半角スペースに置換するサンプル関数。
5 *
6 * mb_ereg_replace() 関数は、多バイト文字の正規表現パターンに基づいて
7 * 文字列の置換を行います。システムエンジニアを目指す初心者向けに、
8 * 日本語処理でよくある全角スペースの変換を例に挙げます。
9 *
10 * この関数は PHP 7.4 および PHP 8 で問題なく動作します。
11 * mbstring エクステンションが有効になっている必要があります。
12 *
13 * @param string $text 置換対象の文字列
14 * @return string 置換後の文字列
15 */
16function normalize_japanese_spaces(string $text): string
17{
18    // mb_ereg_replace が正しく動作するために、内部文字エンコーディングを適切に設定することが重要です。
19    // 通常はphp.iniで設定するか、スクリプトの先頭で mb_regex_encoding() を使います。
20    // 例: mb_regex_encoding('UTF-8');
21    // このサンプルでは簡潔さのため省略しますが、実運用では必ず設定してください。
22
23    // 置換対象のパターン(全角スペース)
24    // mb_ereg_replace() は POSIX 拡張正規表現 (ereg スタイル) を使用します。
25    // そのため、パターンをデリミタ (例: /.../) で囲む必要はありません。
26    $pattern = " "; // 全角スペース (Unicode U+3000)
27
28    // 置換後の文字列(半角スペース)
29    $replacement = " "; // 半角スペース (Unicode U+0020)
30
31    // mb_ereg_replace を使用して全角スペースを半角スペースに置換
32    // mb_ereg_replace(string $pattern, string $replacement, string $string, string $option = 'r')
33    $normalizedText = mb_ereg_replace($pattern, $replacement, $text);
34
35    return $normalizedText;
36}
37
38// サンプルコードの実行例
39$originalText1 = "これは 全角スペースが 含まれる テキストです。";
40echo "元の文字列: " . $originalText1 . PHP_EOL;
41
42$processedText1 = normalize_japanese_spaces($originalText1);
43echo "置換後の文字列: " . $processedText1 . PHP_EOL;
44
45echo PHP_EOL;
46
47$originalText2 = " 先頭と末尾の全角スペースも 変換されます ";
48echo "元の文字列: " . $originalText2 . PHP_EOL;
49
50$processedText2 = normalize_japanese_spaces($originalText2);
51echo "置換後の文字列: " . $processedText2 . PHP_EOL;
52
53?>

PHPのmb_ereg_replace関数は、多バイト文字を含む文字列に対して、正規表現パターンに基づいて特定の文字列を別の文字列に置換するために使用されます。システムエンジニアとして日本語のような複雑な文字セットを扱う際に非常に重要な機能であり、文字コードを意識した正確な文字列操作が可能になります。

このサンプルコードでは、mb_ereg_replace関数を利用して、日本語の全角スペース「 」を半角スペース「 」に置換するnormalize_japanese_spaces関数を定義しています。これは、ユーザー入力の正規化やデータの統一処理などで頻繁に必要となる作業です。

mb_ereg_replace関数は、第一引数に置換したい文字の正規表現パターン(例: " ")、第二引数に置換後の文字列(例: " ")、第三引数に置換対象の元の文字列を指定します。これにより、元の文字列内でパターンにマッチする全ての箇所が指定した文字列に置き換えられます。関数は成功すると置換後の新しい文字列を戻り値として返し、失敗した場合はfalseを返すことがあります。

この関数を正しく利用するためには、PHPのmbstringエクステンションが有効になっている必要があります。また、多バイト文字処理の正確性を保つために、スクリプトの先頭でmb_regex_encoding()関数などを用いて内部文字エンコーディングを適切に設定することが推奨されます。この機能はPHP 7.4およびPHP 8の環境で問題なく動作いたします。

mb_ereg_replace関数は多バイト文字の正規表現置換に用います。パターン記述時はPerl互換正規表現(PCRE)と異なり、デリミタ(例: /.../)で囲む必要がなく、正規表現を直接指定します。最も重要な注意点は、mb_regex_encoding()関数で適切な内部文字エンコーディングを設定することです。これを怠ると、意図しない置換結果になる可能性があります。また、この関数を利用するにはPHPのmbstringエクステンションが有効である必要があります。サンプルコードはPHP 7.4およびPHP 8で動作します。

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

1<?php
2
3/**
4 * mb_eregi_replace 関数を使用して、大文字・小文字を区別せずに文字列を置換します。
5 *
6 * `mb_eregi_replace` は、マルチバイト対応の正規表現(POSIX EREG拡張)を使用し、
7 * 大文字・小文字を区別せずにパターンにマッチする部分を置換します。
8 *
9 * @param string $pattern 検索する正規表現パターン
10 * @param string $replacement 置換文字列
11 * @param string $string 元の文字列
12 * @return string 置換後の文字列
13 */
14function applyMbEregiReplace(string $pattern, string $replacement, string $string): string
15{
16    // mb_eregi_replace は、パターンを大文字・小文字を区別せずに検索し、置換を行います。
17    return mb_eregi_replace($pattern, $replacement, $string);
18}
19
20// サンプル使用例
21$originalText = "Hello World! This is a test string. The world is big.";
22$searchPattern = "world"; // 'World', 'world' などにマッチするパターン
23$replaceText = "Universe";
24
25echo "元の文字列: " . $originalText . PHP_EOL;
26echo "検索パターン (大文字・小文字を区別しない): '" . $searchPattern . "'" . PHP_EOL;
27echo "置換文字列: '" . $replaceText . "'" . PHP_EOL;
28
29$replacedText = applyMbEregiReplace($searchPattern, $replaceText, $originalText);
30
31echo "置換後の文字列: " . $replacedText . PHP_EOL;
32
33echo PHP_EOL; // 出力を見やすくするための区切り
34
35// 別の例: 数字の置き換え
36$numericText = "商品番号: ABC-12345, 価格: 999円";
37$numericPattern = "[0-9]+"; // 1回以上の数字にマッチするパターン
38$replaceNumbersWith = "XXX";
39
40echo "元の文字列: " . $numericText . PHP_EOL;
41echo "検索パターン (大文字・小文字を区別しない): '" . $numericPattern . "'" . PHP_EOL;
42echo "置換文字列: '" . $replaceNumbersWith . "'" . PHP_EOL;
43
44$replacedNumericText = applyMbEregiReplace($numericPattern, $replaceNumbersWith, $numericText);
45
46echo "置換後の文字列: " . $replacedNumericText . PHP_EOL;
47
48?>

PHP 8のmb_eregi_replace関数は、文字列の中から特定のパターンを検索し、別の文字列に置き換えるための関数です。この関数は、日本語のようなマルチバイト文字(全角文字)を正しく扱うことができ、正規表現という強力なルールを使って複雑なパターンも指定できます。

特に重要なのは、関数名のeregiに含まれるiが示す通り、大文字と小文字を区別せずに検索を行う点です。例えば「world」というパターンで検索した場合、「World」や「WORLD」にもマッチします。これにより、ユーザーが入力した文字列の表記ゆれに対応しやすくなります。

引数としては、まず検索したいパターンを正規表現で指定する$pattern、次にパターンに一致した部分に置き換えたい文字列を指定する$replacement、そして置換処理を行いたい元の文字列$stringの3つを渡します。処理が完了すると、パターンに合致する部分が全て置き換えられた新しい文字列が戻り値として返されます。元の文字列自体は変更されません。

この関数は、ウェブサイトのコンテンツで特定の単語を一括で修正したり、入力された文字列から不要な文字を取り除いたりする際など、柔軟な文字列操作が必要な場面で非常に役立ちます。

このサンプルコードで利用されているmb_eregi_replace関数は、PHP 7.0以降で非推奨となり、現在のPHP 8環境では動作しません。システム開発では、最新のPHP環境に合わせたpreg_replace関数の利用が必須です。preg_replaceへ移行する際は、正規表現の構文がPCRE形式に変わること、および大文字・小文字を区別しない置換にはパターンに「i」フラグ(例: /world/i)を含める必要がある点にご注意ください。マルチバイト文字列の処理はmb_ereg系関数と同様に適切に行えますが、エンコーディング設定(mb_internal_encoding()など)を確認することが重要です。

PHP mb_ereg_matchで文字列全体の一致を判定する

1<?php
2
3/**
4 * 文字列が指定した正規表現パターンに全体として一致するかどうかを判定します。
5 * この関数は mb_ereg_match() の使用例を示します。
6 *
7 * @param string $pattern 正規表現パターン (マルチバイト文字対応)
8 * @param string $targetString チェック対象の文字列
9 * @return void
10 */
11function checkFullStringMatch(string $pattern, string $targetString): void
12{
13    // マルチバイト文字の正規表現を正しく扱うために、内部エンコーディングをUTF-8に設定します。
14    // この設定は mb_ereg_match を含む mb_ereg_* 関数群に影響します。
15    mb_regex_encoding('UTF-8');
16
17    echo "--- チェック開始 ---" . PHP_EOL;
18    echo "対象文字列: '{$targetString}'" . PHP_EOL;
19    echo "パターン: '{$pattern}'" . PHP_EOL;
20
21    // mb_ereg_match() は、文字列全体がパターンにマッチする場合に true を返します。
22    // 部分的な一致ではなく、文字列の先頭から末尾までが完全にパターンと一致する必要があります。
23    if (mb_ereg_match($pattern, $targetString)) {
24        echo "結果: マッチしました。" . PHP_EOL;
25    } else {
26        echo "結果: マッチしませんでした。" . PHP_EOL;
27    }
28    echo PHP_EOL;
29}
30
31// --- サンプルコードの実行 ---
32
33// パターン「すべてひらがなである」を定義します。
34// ^ は文字列の先頭、[ぁ-ん]+ はひらがな1文字以上、 $ は文字列の末尾を意味します。
35$hiraganaPattern = '^[ぁ-ん]+$';
36
37// マッチする例
38checkFullStringMatch($hiraganaPattern, 'こんにちは');
39
40// マッチしない例 (カタカナが含まれているため)
41checkFullStringMatch($hiraganaPattern, 'こんにちはセカイ');
42
43
44// パターン「有効な郵便番号形式(ハイフンあり)である」を定義します。
45// \d{3} は数字3桁、- はハイフン、\d{4} は数字4桁を意味します。
46$zipCodePattern = '^\d{3}-\d{4}$';
47
48// マッチする例
49checkFullStringMatch($zipCodePattern, '100-0001');
50
51// マッチしない例 (ハイフンがないため)
52checkFullStringMatch($zipCodePattern, '1000001');
53
54// マッチしない例 (全角数字が含まれているため)
55checkFullStringMatch($zipCodePattern, '100-0001');
56
57?>

PHPの mb_ereg_match 関数は、指定した文字列が正規表現パターンに「全体として」一致するかどうかを判定するために使用します。文字列の一部分が一致するだけでは不十分で、文字列の先頭から末尾までが完全にパターンと合致する必要があります。

この関数の第1引数には正規表現パターンを、第2引数には検査対象の文字列を指定します。戻り値は、文字列全体がパターンに一致した場合には true を、一致しなかった場合は false を返します。日本語のようなマルチバイト文字を正しく扱うために、事前に mb_regex_encoding() 関数で文字エンコーディング(例: 'UTF-8')を設定することが重要です。

サンプルコードでは、この関数を使って2種類の検証を行っています。1つ目は、文字列が「すべてひらがな」であるかの判定です。'こんにちは' はパターンに完全一致するため true となりますが、カタカナを含む 'こんにちはセカイ' は一致しません。2つ目は、「郵便番号の形式」に合致するかの判定です。'100-0001' は形式通りであるため一致しますが、ハイフンがなかったり全角数字が使われていたりすると一致しないことが示されています。このように、特定のフォーマットを厳密にチェックする際に役立ちます。

この関数を使用する際は、事前にmb_regex_encoding()で文字エンコーディングを正しく設定することが重要です。この設定を忘れると、特に日本語などのマルチバイト文字を扱う際に意図通りに動作しない原因となります。mb_ereg_match()は文字列の先頭から末尾までが完全にパターンと一致するかを判定する関数です。文字列の一部が一致するかを調べるmb_ereg()とは役割が異なるため、目的に応じて使い分けてください。また、正規表現パターン内の\dは半角数字にのみマッチします。全角数字も対象に含めたい場合は、パターンを[0-90-9]のように記述する必要があります。

PHP mb_eregで単語を強調する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * テキスト内の特定の単語を検索し、HTMLの<strong>タグで強調(置換)します。
7 *
8 * このサンプルは、マルチバイト文字列に対応した正規表現置換関数 `mb_ereg_replace` を使用します。
9 * 大文字・小文字を区別せずにキーワードを検索し、マッチした部分を置換します。
10 *
11 * @param string $text 対象のテキスト。
12 * @param string $keyword 強調表示したいキーワード。
13 * @return string キーワードが強調表示されたテキスト。
14 */
15function highlightWords(string $text, string $keyword): string
16{
17    // 検索パターンとしてキーワードをそのまま使用します。
18    $pattern = $keyword;
19
20    // 置換後の文字列を定義します。
21    // '\\0' は正規表現にマッチした文字列全体を指す「後方参照」です。
22    // これにより、'PHP'や'php'など、マッチした元の表記を維持したままタグで囲むことができます。
23    $replacement = '<strong>\\0</strong>';
24
25    // 検索オプションを指定します。'i'は大文字と小文字を区別しないことを意味します。
26    $options = 'i';
27
28    // mb_ereg_replace を使用して、テキスト内のキーワードを置換します。
29    // エラーが発生した場合、falseまたはnullが返ることがあるため、
30    // 確実に文字列を返すようにキャストします。
31    $result = mb_ereg_replace($pattern, $replacement, $text, $options);
32
33    return (string)$result;
34}
35
36// --- 実行例 ---
37
38// 置換対象の日本語テキスト
39$originalText = 'PHPはWeb開発で人気のある言語です。多くのエンジニアがphpを学んでいます。';
40
41// 強調したいキーワード
42$targetKeyword = 'PHP';
43
44// 関数を呼び出してキーワードを強調
45$highlightedText = highlightWords($originalText, $targetKeyword);
46
47// 結果をHTMLとして出力
48header('Content-Type: text/html; charset=utf-8');
49echo '<p>' . htmlspecialchars($originalText, ENT_QUOTES, 'UTF-8') . '</p>';
50echo '<p>↓</p>';
51// 下の行では、<strong>タグがHTMLとして解釈されるようにhtmlspecialcharsは使用しません。
52echo '<p>' . $highlightedText . '</p>';
53
54// --- 期待されるブラウザでの表示 ---
55//
56// PHPはWeb開発で人気のある言語です。多くのエンジニアがphpを学んでいます。
57//
58// ↓
59//
60// <strong>PHP</strong>はWeb開発で人気のある言語です。多くのエンジニアが<strong>php</strong>を学んでいます。
61

このサンプルコードは、マルチバイト文字(日本語など)に対応した正規表現置換を行うmb_ereg_replace関数の使用例です。指定したテキストの中から、特定のキーワードを検索し、HTMLの<strong>タグで囲んで強調表示(太字に)する処理を実装しています。

この関数は主に4つの引数を取ります。第1引数$patternには検索する文字列のパターンを正規表現で指定します。第2引数$replacementには、パターンに一致した部分を置き換えるための文字列を指定します。ここで使われている\\0は「一致した文字列全体」を指す特殊な記法(後方参照)で、これにより'PHP'や'php'といった元の表記を維持したままタグ付けが可能です。第3引数$textは、処理対象となる元の文字列です。第4引数$optionsでは検索の挙動を制御でき、サンプルでは'i'を指定することで大文字・小文字を区別しない検索を実現しています。

関数の戻り値は、置換処理が行われた後の文字列です。ただし、エラーが発生した場合などにはfalsenullが返る可能性があるため、サンプルでは(string)キャストを行い、常に文字列として結果を扱えるようにしています。

mb_ereg_replace関数はマルチバイト文字の置換に便利ですが、いくつか注意点があります。まず、検索パターンに正規表現で特別な意味を持つ記号(例: .*)が含まれると、意図しないマッチングが起こるため注意が必要です。置換文字列内の\\0は、マッチした文字列全体を指す後方参照という機能です。これを正しく扱うには、サンプルコードのようにシングルクォートで囲むのが確実です。また、この関数を正しく動作させるには、mb_internal_encoding()であらかじめ文字エンコーディングを'UTF-8'などに指定しておくことが推奨されます。関数の戻り値はエラー時に文字列以外になる可能性があるため、(string)でキャストするとより安全なコードになります。最後に、このサンプルはHTMLタグを生成するため、ユーザーからの入力をキーワードにする際は、htmlspecialcharsで無害化するなどのセキュリティ対策が必須です。

関連コンテンツ

関連プログラミング言語