Navngitte grupper i PHP regex
La oss si at vi ved hjelp av preg_match ønsker
å dele opp en dato i dag, måned og år. La oss bruke
grupper for dette:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // vil skrive ut ['2025-10-29', '2025', '10', '29']
?>
Som du ser, får vi et array som resultat, der elementet på indeks 0 vil være hele datoen, på indeks 1 - året, på indeks 2 - måneden, på indeks 3 - dagen.
Noen ganger ville det imidlertid vært praktisk å få innholdet i gruppene som et assosiativt array. Det vil si at i vårt tilfelle ville det vært fint å få et array som dette:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
For dette finnes det en spesiell
syntaks i regex. Her er den: (?<name>pattern),
hvor pattern er regex-mønsteret, og name
er navnet på gruppen.
La oss omskrive vårt dato-regex-mønster ved hjelp av navngitte grupper:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Som et resultat vil vi få et assosiativt array, der nøklene vil være navnene på gruppene, og verdiene vil være det som ble fanget opp i dem:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
I virkeligheten i arrayet med resultatet vil verdiene
fra gruppene være tilgjengelige både ved navn og
ved rekkefølgenummer. Det vil si for eksempel at
året vil være tilgjengelig via nøkkelen 'year'
og via nummer 1, måneden - via nøkkelen 'month'
og via nummer 2, og så videre:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
De beskrevne navngitte gruppene har noen flere
alternative syntakser: (?P<name>pattern)
og (?'name'pattern).
Det er gitt en streng med tid:
<?php
$str = '12:59:59';
?>
Plasser timer, minutter og sekunder i separate navngitte grupper.
Skriv en funksjon som i arrayet med resultatet sletter alle nummererte grupper, og bare beholder de navngitte.