Nimettyjen sieppausryhmien PHP:ssä

Oletetaan, että haluamme preg_match:n avulla jakaa päivämäärän päiväksi, kuukaudeksi ja vuodeksi. Käytämme siihen sieppausryhmiä:

php<?php
  $str = '2025-10-29';
  $reg = '#(\d{4})-(\d{2})-(\d{2})#';
  
  preg_match($reg, $str, $match);
  var_dump($match); // tulostaa ['2025-10-29', '2025', '10', '29']
?>

Kuten näette, tuloksena saamme taulukon, jossa nollannessa elementissä on koko päivämäärä, ensimmäisessä - vuosi, toisessa - kuukausi, kolmannessa - päivä.

Toisinaan olisi kuitenkin kätevää saada sieppausryhmien sisältö assosiatiivisena taulukkona. Eli meidän tapauksessamme olisi mukavaa saada tällainen taulukko:

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

Tätä varten säännöllisissä lausekkeissa on olemassa erityinen syntaksi. Tässä se on: (?<name>pattern), missä pattern on säännöllinen lauseke ja name on sieppausryhmän nimi.

Kirjoitetaan päivämäärän säännöllinen lauseke uudelleen nimetyillä sieppausryhmillä:

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

Tuloksena saamme assosiatiivisen taulukon, jossa avaimina ovat sieppausryhmien nimet, ja arvoina - niihin osuneet sisällöt:

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

Itse asiassa tulostaulukossa sieppausryhmien arvot ovat saatavilla sekä nimellä että järjestysnumeron mukaan. Eli esimerkiksi vuosi on saatavilla avaimella 'year' ja numerolla 1, kuukausi - avaimella 'month' ja numerolla 2 ja niin edelleen:

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

Kuvatuilla nimetyillä sieppausryhmillä on vielä muutama vaihtoehtoinen syntaksi: (?P<name>pattern) ja (?'name'pattern).

Задание 1

Annettu merkkijono, jossa on kellonaika:

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

Sijoita tunnit, minuutit ja sekunnit erillisiin nimitettyihin sieppausryhmiin.

Задание 2

Kirjoita funktio, joka poistaa tulostaulukosta kaikki numeroitujen sieppausryhmät, jättäen vain nimetyt.