PHP正規表現における名前付きキャプチャグループ
preg_matchを使って日付を日、月、年に分割したいとします。
そのためにキャプチャグループを使用します:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // 出力: ['2025-10-29', '2025', '10', '29']
?>
ご覧の通り、結果として得られる配列の0番目の要素は日付全体、 1番目は年、2番目は月、3番目は日となります。
しかし、時にはキャプチャグループの内容を連想配列として取得できたら便利な場合があります。 つまり、このケースでは次のような配列を取得できると良いでしょう:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
このため、正規表現には特別な構文が存在します。
それは次の通りです: (?<name>pattern)。
ここでpatternは正規表現パターン、nameはキャプチャグループの名前です。
日付用の正規表現を名前付きキャプチャグループを使って書き直してみましょう:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
結果として、キーがキャプチャグループ名、値がキャプチャされた内容となる 連想配列が得られます:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
実際には、結果の配列ではキャプチャグループの値は名前と番号の両方でアクセス可能です。
つまり、例えば年はキー'year'と番号1で、
月はキー'month'と番号2でアクセスでき、以下同様です:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
説明した名前付きキャプチャグループには他にもいくつかの代替構文があります:
(?P<name>pattern) と (?'name'pattern)。
時刻の文字列が与えられています:
<?php
$str = '12:59:59';
?>
時、分、秒をそれぞれ別の名前付きキャプチャグループに入れてください。
結果の配列からすべての番号付きキャプチャグループを削除し、 名前付きのものだけを残す関数を書いてください。