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