PHP正規表現における名前付きキャプチャグループ

preg_matchを使って日付を日、月、年に分割したいとします。 そのためにキャプチャグループを使用します:

php<?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番目は日となります。

しかし、時にはキャプチャグループの内容を連想配列として取得できたら便利な場合があります。 つまり、このケースでは次のような配列を取得できると良いでしょう:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29'
]

このため、正規表現には特別な構文が存在します。 それは次の通りです: (?<name>pattern)。 ここでpatternは正規表現パターン、nameはキャプチャグループの名前です。

日付用の正規表現を名前付きキャプチャグループを使って書き直してみましょう:

php<?php
  $str = '2025-10-29';
  $reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
  
  preg_match($reg, $str, $match);
  var_dump($match);
?>

結果として、キーがキャプチャグループ名、値がキャプチャされた内容となる 連想配列が得られます:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29',
]

実際には、結果の配列ではキャプチャグループの値は名前と番号の両方でアクセス可能です。 つまり、例えば年はキー'year'と番号1で、 月はキー'month'と番号2でアクセスでき、以下同様です:

php[
  'year'  => '2025',
  'month' => '10',
  'day'   => '29',
  
  1       => '2025',
  2       => '10',
  3       => '29'
]

説明した名前付きキャプチャグループには他にもいくつかの代替構文があります: (?P<name>pattern) と (?'name'pattern)。

Задание 1

時刻の文字列が与えられています:

php<?php
  $str = '12:59:59';
?>

時、分、秒をそれぞれ別の名前付きキャプチャグループに入れてください。

Задание 2

結果の配列からすべての番号付きキャプチャグループを削除し、 名前付きのものだけを残す関数を書いてください。