【PHP8.x】mb_ereg_search_regs()関数の使い方
mb_ereg_search_regs関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
mb_ereg_search_regs関数は、マルチバイト文字列に対して正規表現検索を行い、一致した部分文字列の情報を配列として取得する関数です。この関数は、事前にmb_ereg_search_init()関数によって設定された検索対象文字列と、mb_ereg_search_set_pattern()またはmb_ereg_search_init()で設定された正規表現パターンに基づいて検索を実行します。
検索が成功した場合、見つかった文字列全体、および正規表現パターン内で括弧 () で囲んで指定された部分(サブマッチ)を要素とする配列を返します。これにより、ただ一致したかどうかだけでなく、具体的にどの部分がどのような形で一致したかを詳細に抽出することが可能です。特に日本語や中国語などのマルチバイト文字を含む文字列に対して、正確な正規表現マッチングを行いたい場合に非常に有用です。
検索に失敗した場合や、一致する部分が見つからなかった場合は、falseを返します。この関数は、mb_ereg_search()関数と組み合わせて使用することで、検索対象文字列中の複数の一致箇所を順次見つけて処理するような、高度なテキスト解析やデータ抽出のシナリオで活用されます。システム開発において、特定の書式に則ったデータから必要な情報を正確に抽出し、利用する際に重要な役割を果たします。
構文(syntax)
1<?php 2// 事前に検索対象の文字列と正規表現パターンを設定 3mb_ereg_search_init("吾輩は猫である", "猫"); 4 5// 直前の検索でマッチした部分文字列を配列として取得する 6// マッチしなかった場合は false を返す 7$result = mb_ereg_search_regs(); 8?>
引数(parameters)
?string $pattern = null, ?string $options = null
- ?string $pattern = null: 検索パターンを指定する文字列。
nullの場合は、直前にmb_ereg_search_init()で設定されたパターンが使用されます。 - ?string $options = null: 検索オプションを指定する文字列。
nullの場合は、直前にmb_ereg_search_init()で設定されたオプションが使用されます。
戻り値(return)
array|false
正規表現検索でマッチした部分文字列の配列、またはマッチしなかった場合は false を返します。
サンプルコード
PHP mb_ereg_matchで全体マッチとキャプチャ
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 文字列全体が正規表現にマッチするかをチェックし、マッチした場合はキャプチャグループを返します。 7 * `mb_ereg_match` の挙動を `mb_ereg_search_regs` を使って模倣した例です。 8 * この関数は、`mb_ereg_search_init` および `mb_ereg_search` と組み合わせて使用されます。 9 * 10 * @param string $text 検索対象の文字列 11 * @param string $pattern 正規表現パターン (文字列全体のマッチングを意図する場合、`^` と `$` を含めることを推奨します) 12 * @return array|false マッチした場合はキャプチャグループの配列、そうでなければ `false` 13 */ 14function findAndCaptureFullMatch(string $text, string $pattern): array|false 15{ 16 // 検索対象の文字列を mb_ereg 検索エンジンに初期化します。 17 // これにより、以降の mb_ereg_search や mb_ereg_search_regs はこの文字列に対して操作を行います。 18 mb_ereg_search_init($text); 19 20 // 指定されたパターンで文字列全体にマッチするかどうかを検索します。 21 // `mb_ereg_match` の機能に合わせるため、パターンには `^` (文字列の先頭) と `$` (文字列の末尾) を含めることで、 22 // 文字列全体のマッチングを強制することになります。 23 // また、正規表現内のバックスラッシュ (`\`) は、PHPの文字列リテラルでもエスケープ (`\\`) が必要です。 24 if (mb_ereg_search($pattern)) { 25 // `mb_ereg_search()` が成功した場合、`mb_ereg_search_regs()` を呼び出して、 26 // マッチした部分文字列とキャプチャグループの情報を取得します。 27 // 引数を指定しない場合、直前の `mb_ereg_search()` の結果が利用されます。 28 // 戻り値は、マッチした文字列全体 (インデックス0) と、 29 // 各キャプチャグループ (インデックス1以降) を含む配列、または `false` です。 30 $regs = mb_ereg_search_regs(); 31 32 if ($regs !== false) { 33 echo "「{$text}」はパターン「{$pattern}」に全体がマッチしました。\n"; 34 echo "キャプチャされたグループ:\n"; 35 foreach ($regs as $index => $match) { 36 // インデックス0は正規表現全体にマッチした部分、 37 // インデックス1以降は括弧で囲まれたキャプチャグループにマッチした部分を示します。 38 echo " [{$index}]: '{$match}'\n"; 39 } 40 return $regs; 41 } 42 } 43 44 echo "「{$text}」はパターン「{$pattern}」に全体がマッチしませんでした。\n"; 45 return false; 46} 47 48// --- 使用例 --- 49 50// 例1: メールアドレスの基本的な形式に全体がマッチし、ユーザー名とドメインをキャプチャする 51$email = "test@example.com"; 52// `\\.` のようにドットをエスケープし、`^` と `$` で文字列全体を対象とします。 53$emailPattern = "^([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})$"; 54findAndCaptureFullMatch($email, $emailPattern); 55 56echo "\n"; 57 58// 例2: 数字のみの文字列に全体がマッチし、その数字をキャプチャする 59$numericString = "12345"; 60// `\\d` は数字を表す正規表現です。`^` と `$` で文字列全体を対象とします。 61$numericPattern = "^(\\d+)$"; 62findAndCaptureFullMatch($numericString, $numericPattern); 63 64echo "\n"; 65 66// 例3: マッチしない例 - 不正な形式のメールアドレス 67$invalidEmail = "invalid-email"; 68findAndCaptureFullMatch($invalidEmail, $emailPattern); 69 70echo "\n"; 71 72// 例4: マッチしない例 - パターンが文字列の一部にしかマッチしない場合 73$partiallyMatchingText = "hello world"; 74// このパターンは "hello world" の "hello" にはマッチしますが、`^` と `$` を使っていないため、 75// 文字列全体(`world`を含む)にはマッチしないため、`false` を返します。 76$partialPattern = "^hello$"; // `$` が付いているため "hello" という文字列自体にしかマッチしません。 77findAndCaptureFullMatch($partiallyMatchingText, $partialPattern); 78
mb_ereg_search_regsは、PHPでマルチバイト文字列に対して正規表現検索を行い、マッチした部分文字列とキャプチャグループの情報を配列で取得する関数です。この関数を使うには、まずmb_ereg_search_initで検索対象文字列を設定し、mb_ereg_searchで正規表現パターンにマッチするかを検索しておく必要があります。
引数$patternには正規表現パターンを指定します。$optionsは検索オプションですが、通常は省略できます。戻り値は、マッチに成功した場合は、正規表現全体にマッチした文字列が配列の0番目に、続くインデックスにはキャプチャグループにマッチした部分が順に格納された配列を返します。マッチしなかった場合やエラー発生時はfalseを返します。
サンプルコードでは、mb_ereg_search_regsを用いてmb_ereg_matchのように文字列全体が正規表現にマッチするかを判定し、キャプチャグループを取得する例を示しています。mb_ereg_searchで文字列全体を対象とする場合、正規表現パターンに文字列の先頭を示す^と末尾を示す$を含めることが重要です。これにより、パターンが文字列の一部にマッチするのではなく、文字列全体にマッチした場合のみ成功と判断されます。取得した配列はforeachループで展開し、マッチした各部分を確認できます。メールアドレスや数字のみの文字列の検証と、マッチしない場合の挙動が具体的に示されており、正規表現による文字列処理の基本を理解するのに役立ちます。
このサンプルコードでは、mb_ereg_search_regs関数を使用する前に、必ずmb_ereg_search_initで検索対象文字列を設定し、mb_ereg_searchで正規表現のマッチングを実行する必要があります。mb_ereg_matchのような文字列全体のマッチングを意図する場合は、正規表現パターンに^(文字列の先頭)と$(文字列の末尾)を含めることが重要です。また、正規表現内で特殊文字をエスケープする際に用いるバックスラッシュは、PHPの文字列リテラル内でもエスケープが必要なため、\\のように二重に記述してください。mb_ereg_search_regsはマッチ結果の配列またはfalseを返すため、必ず戻り値をチェックし、falseの場合のエラーハンドリングを適切に行う必要があります。返される配列のインデックス0には正規表現全体にマッチした部分、インデックス1以降にはキャプチャグループにマッチした部分が含まれます。
PHP mb_ereg_search_regsでバージョン情報を抽出する
1<?php 2 3/** 4 * 指定されたテキストから、正規表現パターンにマッチするPHPのバージョン情報を抽出します。 5 * mb_ereg_search_init と mb_ereg_search_regs を組み合わせて、 6 * テキスト内のすべてのマッチを反復処理で取得します。 7 * 8 * @param string $text 検索対象の文字列。 9 * @return array 抽出されたバージョン情報の配列。各要素は 'full_match' (全体のマッチ) と 10 * 'version_number' (キャプチャグループ1のマッチ、数字部分) を含みます。 11 */ 12function extractPhpVersions(string $text): array 13{ 14 // マルチバイト文字列の正規表現エンジンで使用するエンコーディングを設定します。 15 // これにより、様々な言語の文字が正しく扱われることを保証します。 16 mb_regex_encoding('UTF-8'); 17 18 // 検索対象の文字列を初期化します。 19 // mb_ereg_search_regs は、この関数で設定された文字列に対して正規表現検索を行います。 20 mb_ereg_search_init($text); 21 22 // 検索する正規表現パターンを定義します。 23 // 'PHP([0-9]+)' は、「PHP」という文字列の後に1つ以上の数字が続くパターンを意味します。 24 // カッコ()で囲まれた部分は「キャプチャグループ」となり、マッチした数字部分を個別に取得できます。 25 $pattern = 'PHP([0-9]+)'; 26 27 // 正規表現オプションを定義します。 28 // 'i' オプションは、大文字と小文字を区別しない検索 (case-insensitive) を意味します。 29 $options = 'i'; 30 31 $foundVersions = []; 32 33 // mb_ereg_search_regs をループで繰り返し呼び出すことで、テキスト内のすべてのマッチを取得します。 34 // mb_ereg_search_regs は、マッチが見つかるとマッチした部分の配列を返し、 35 // 内部的な検索位置を次のマッチの開始位置に更新します。 36 // マッチが見つからなくなると false を返します。 37 while (false !== ($matches = mb_ereg_search_regs($pattern, $options))) { 38 // $matches[0] には、正規表現パターン全体にマッチした文字列が格納されます(例: "PHP7")。 39 // $matches[1] には、最初のキャプチャグループ(上記パターンでは数字部分)にマッチした文字列が格納されます(例: "7")。 40 41 $foundVersions[] = [ 42 'full_match' => $matches[0], 43 'version_number' => $matches[1] ?? null, // キャプチャグループが存在しない可能性も考慮 44 ]; 45 } 46 47 // 抽出されたすべてのバージョン情報を返します。 48 return $foundVersions; 49} 50 51// サンプルとして使用するテキストデータ 52$sampleText = "現在のPHPの安定版はPHP8.2ですが、PHP8.3もリリースされました。以前はPHP7.4が広く使われていました。"; 53 54// extractPhpVersions関数を呼び出し、テキストからPHPバージョン情報を抽出します。 55$extractedData = extractPhpVersions($sampleText); 56 57// 抽出された結果を表示します。 58if (!empty($extractedData)) { 59 echo "テキストから抽出されたPHPバージョン情報:\n"; 60 foreach ($extractedData as $data) { 61 echo sprintf( 62 " - 全体マッチ: '%s', バージョン番号: '%s'\n", 63 $data['full_match'], 64 $data['version_number'] ?? 'N/A' // バージョン番号が取得できなかった場合の表示 65 ); 66 } 67} else { 68 echo "テキスト中にPHPバージョン情報は検出されませんでした。\n"; 69} 70 71?>
このサンプルコードは、PHPのmb_ereg_search_regs関数を使用して、指定されたテキストから正規表現にマッチするPHPバージョン情報を抽出する方法を示しています。mb_ereg_search_regsは、mb_ereg_search_initで初期化された文字列に対して正規表現検索を行い、マッチした部分の情報を配列として返します。
まず、mb_regex_encoding('UTF-8')でマルチバイト正規表現のエンコーディングを設定し、mb_ereg_search_init($text)で検索対象の文字列を準備します。これにより、mb_ereg_search_regsはどのテキストを検索するかを認識する準備が整います。
mb_ereg_search_regs関数の引数$patternには検索したい正規表現パターンを、$optionsには検索オプション(例: 'i'で大文字小文字を区別しない)を指定します。このサンプルでは「PHP」に続く数字を「PHP([0-9]+)」というパターンで検索し、括弧内の数字部分をキャプチャグループとして個別に取得しています。
この関数は、マッチが見つかった場合はマッチした文字列の配列を返し、見つからなかった場合はfalseを返します。返される配列の[0]番目には正規表現全体にマッチした文字列が、[1]番目には最初のキャプチャグループ(ここでは数字部分)にマッチした文字列が格納されます。サンプルコードでは、while (false !== ($matches = mb_ereg_search_regs($pattern, $options)))のようにループで繰り返し呼び出すことで、テキスト内にあるすべてのマッチを順番に抽出し、それぞれをfull_matchとversion_numberとして配列に格納しています。この方法により、複数のPHPバージョン情報がテキスト中に含まれていても、すべてを正確に取得することができます。
mb_ereg_search_regsを使用する際は、まずmb_ereg_search_initで検索対象の文字列を初期化してください。このステップを省略すると、検索が期待通りに動作しません。すべてのマッチを取得するには、本関数をループ内で繰り返し呼び出す必要があります。一度の呼び出しでは最初のマッチしか得られません。
マルチバイト文字列を正しく処理するため、mb_regex_encodingで'UTF-8'などの適切なエンコーディングを必ず設定してください。これは文字化けや意図しない結果を防ぎます。
マッチが見つからない場合、関数はfalseを返すため、戻り値を適切にチェックしてエラーハンドリングを行うことが重要です。
正規表現パターンの()はキャプチャグループとして機能し、マッチした内容が結果配列の$matches[1]以降に格納されます。キーワードにあるmb_ereg_replaceは文字列置換に使う別の関数である点にご注意ください。