Pavadinti grupavimai PHP reguliariosiose išraiškose
Tarkime, kad naudodami preg_match norime
išskaidyti datą į dieną, mėnesį ir metus. Panaudokime
tam grupavimus:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // išves ['2025-10-29', '2025', '10', '29']
?>
Kaip matote, rezultate gauname masyvą, kuriame nuliname elemente bus visa data, pirmame - metai, antrame - mėnuo, trečiame - diena.
Kartais, tačiau, būtų patogu gauti grupavimų turinį kaip asociatyvų masyvą. Tai yra mūsų atveju būtų gerai gauti štai tokį masyvą:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Tam reguliariosiose išraiškose egzistuoja speciali
sintaksė. Štai ji: (?<name>pattern),
kur pattern - tai reguliarioji išraiška, o name
- tai grupavimo vardas.
Perrašykime mūsų datos reguliariąją išraišką naudodami pavadintus grupavimus:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Rezultate mes gausime asociatyvų masyvą, kuriame raktai bus grupavimų vardai, o reikšmės - tai, kas į juos pateko:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Tiesą sakant, rezultatų masyve grupavimų reikšmės
bus prieinamos ir pagal vardą, ir
pagal eilės numerį. Tai yra, pavyzdžiui,
metai bus prieinami pagal raktą 'year'
ir pagal numerį 1, mėnuo - pagal raktą 'month'
ir pagal numerį 2 ir taip toliau:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Aprašyti pavadinti grupavimai turi dar keletą
alternatyvių sintaksų: (?P<name>pattern)
ir (?'name'pattern).
Duota eilutė su laiku:
<?php
$str = '12:59:59';
?>
Padėkite valandas, minutes ir sekundes į atskirus pavadintus grupavimus.
Parašykite funkciją, kuri masyve su rezultatu pašalintų visus sunumeruotus grupavimus, palikdama tik pavadintus.