Navngivne lommer i PHP regulære udtryk
Lad os med preg_match ønske at
opdele en dato i dag, måned og år. Vi bruger
lommer til dette:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // udskriver ['2025-10-29', '2025', '10', '29']
?>
Som du kan se, får vi et array som resultat, hvor det nulte element vil være hele datoen, det første - året, det andet - måneden, det tredje - dagen.
Nogle gange ville det dog være praktisk at få indholdet af lommerne som et associativt array. Det vil sige, i vores tilfælde ville det være godt at få et array som dette:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Til dette findes der en speciel syntaks i regulære udtryk.
Her er den: (?<name>pattern),
hvor pattern er det regulære udtryk, og name
er navnet på lommen.
Lad os omskrive vores regulære udtryk for datoen med navngivne lommer:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Som resultat får vi et associativt array, hvor nøglerne vil være lommernes navne, og værdierne - det, der endte i dem:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
I virkeligheden vil værdierne af lommerne i resultatarrayet
være tilgængelige både efter navn og efter rækkenummer.
Det vil sige, for eksempel vil
året være tilgængeligt med nøglen 'year'
og med nummeret 1, måneden - med nøglen 'month'
og med nummeret 2 og så videre:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
De beskrevne navngivne lommer har yderligere et par
alternative syntakser: (?P<name>pattern)
og (?'name'pattern).
Der gives en streng med et klokkeslæt:
<?php
$str = '12:59:59';
?>
Placer timer, minutter og sekunder i separate navngivne lommer.
Skriv en funktion, der i resultatarrayet fjerner alle de nummererede lommer og kun efterlader de navngivne.