Namngivna capture-grupper i PHP regex
Låt oss säga att vi med preg_match vill
dela upp ett datum på dag, månad och år. Vi använder
capture-grupper för detta:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // skriver ut ['2025-10-29', '2025', '10', '29']
?>
Som du ser får vi ett array som resultat, där element noll innehåller hela datumet, element ett - året, element två - månaden, element tre - dagen.
Ibland vore det dock bekvämt att få innehållet i capture-grupperna som en associativ array. Det vill säga i vårt fall vore det bra att få följande array:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
För detta finns en speciell syntax i regex.
Här är den: (?<name>pattern),
där pattern är regex-mönstret, och name
är namnet på capture-gruppen.
Låt oss skriva om vårt datum-regex med namngivna capture-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 ett resultat kommer vi att få en associativ array, där nycklarna är namnen på capture-grupperna, och värdena är det som hamnade i dem:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
I verkligheten kommer värdena från capture-grupperna i resultatarrayen
att vara tillgängliga både med namn och med ordningsnummer.
Det vill säga, till exempel,
kommer året att vara tillgängligt med nyckeln 'year'
och med numret 1, månaden - med nyckeln 'month'
och med numret 2, och så vidare:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
De beskrivna namngivna capture-grupperna har ytterligare några
alternativa syntaxer: (?P<name>pattern)
och (?'name'pattern).
Given en sträng med en tid:
<?php
$str = '12:59:59';
?>
Lägg timmar, minuter och sekunder i separata namngivna capture-grupper.
Skriv en funktion som i arrayen med resultatet raderar alla numrerade capture-grupper, och endast lämnar kvar de namngivna.