Poimenovani zajeti v regularnih izrazih PHP
Recimo, da želimo z preg_match
razbiti datum na dan, mesec in leto. Uporabimo
za to zajete:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // izpiše ['2025-10-29', '2025', '10', '29']
?>
Kot vidite, kot rezultat dobimo matriko, v kateri bo na ničelnem elementu celoten datum, na prvem - leto, na drugem - mesec, na tretjem - dan.
Včasih pa bi bilo priročno dobiti vsebino zajetih kot asociativno matriko. Se prav v našem primeru bi bilo dobro dobiti takšno matriko:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Za to v regularnih izrazih obstaja posebna
sintaksa. Tukaj je: (?<name>pattern),
kjer je pattern - regularni izraz, name
pa je ime zajeta.
Prepišimo naš regularni izraz za datum z uporabo poimenovanih zajetov:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Kot rezultat bomo dobili asociativno matriko, v kateri bodo ključi imena zajetov, vrednosti pa - kar se je ujelo vanje:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Pravzaprav bodo v matriki z rezultatom vrednosti
zajetov dostopne tako po imenu kot
po zaporedni številki. Se pravi, na primer,
leto bo dostopno po ključu 'year'
in po številki 1, mesec - po ključu 'month'
in po številki 2 in tako naprej:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Opisani poimenovani zajeti imajo še nekaj
alternativnih sintaks: (?P<name>pattern)
in (?'name'pattern).
Podan je niz s časom:
<?php
$str = '12:59:59';
?>
Postavite ure, minute in sekunde v ločene poimenovane zajete.
Napišite funkcijo, ki bo v matriki z rezultatom izbrisala vsa oštevilčena zajeta, pustila pa samo poimenovana.