Benannte Gruppen in PHP Regex
Nehmen wir an, wir möchten mit preg_match
ein Datum in Tag, Monat und Jahr aufteilen. Wir verwenden
dafür Gruppen:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // gibt aus ['2025-10-29', '2025', '10', '29']
?>
Wie Sie sehen, erhalten wir als Ergebnis ein Array, in dem sich das gesamte Datum im nullten Element befindet, im ersten - das Jahr, im zweiten - der Monat, im dritten - der Tag.
Manchmal wäre es jedoch praktisch, den Inhalt der Gruppen als assoziatives Array zu erhalten. Das heißt, in unserem Fall wäre es schön, ein solches Array zu bekommen:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Dafür gibt es in regulären Ausdrücken eine spezielle
Syntax. Hier ist sie: (?<name>pattern),
wo pattern - der reguläre Ausdruck ist und name
- der Name der Gruppe.
Schreiben wir unseren regulären Ausdruck für das Datum mit benannten Gruppen um:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Als Ergebnis erhalten wir ein assoziatives Array, in dem die Schlüssel die Gruppennamen sind und die Werte das, was in sie hineingepasst hat:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Tatsächlich sind die Werte der Gruppen im Ergebnisarray
sowohl über ihren Namen als auch über ihre numerische Position verfügbar.
Das heißt, zum Beispiel ist das Jahr sowohl unter dem Schlüssel 'year'
als auch unter der Nummer 1 verfügbar, der Monat - unter dem Schlüssel 'month'
und unter der Nummer 2 und so weiter:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Die beschriebenen benannten Gruppen haben noch einige
alternative Syntaxformen: (?P<name>pattern)
und (?'name'pattern).
Gegeben ist ein String mit einer Uhrzeit:
<?php
$str = '12:59:59';
?>
Speichern Sie Stunden, Minuten und Sekunden in separate benannte Gruppen.
Schreiben Sie eine Funktion, die im Ergebnisarray alle numerierten Gruppen löscht und nur die benannten übrig lässt.