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
$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:
[
'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
$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:
[
'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:
[
'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).
Annettu merkkijono, jossa on kellonaika:
<?php
$str = '12:59:59';
?>
Sijoita tunnit, minuutit ja sekunnit erillisiin nimitettyihin sieppausryhmiin.
Kirjoita funktio, joka poistaa tulostaulukosta kaikki numeroitujen sieppausryhmät, jättäen vain nimetyt.