Gesamtzahl der Gruppen in PHP Regex
Betrachten wir die folgende Situation. Nehmen wir an, wir haben
eine Variable mit einem Jahr, das sich
von 1990 bis 2099 ändern kann.
Nehmen wir an, wir möchten die letzten beiden Ziffern
des Jahres in einer Gruppe erfassen. Schreiben wir den entsprechenden regulären Ausdruck:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Hier erwartet uns jedoch eine Unannehmlichkeit. Die Sache ist die, dass für die Jahre des 20. Jahrhunderts die beiden Ziffern in die erste Gruppe gelangen, und für die Jahre des 21. Jahrhunderts - in die zweite. Sehen wir uns Beispiele an.
Hier ist die erste Variante:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Und hier ist die zweite Variante:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Nehmen wir nun an, wir möchten die gefundenen Jahresziffern in eine Variable schreiben. Es erwartet uns ein Problem, denn wir wissen nicht genau, mit welchem Schlüssel wir die Daten aus der Gruppe entnehmen sollen:
<?php
$year = $res[1]; // Schlüssel wird entweder 1 oder 2 benötigt
?>
Man kann das Problem durch eine Bedingung lösen:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Es gibt jedoch eine einfachere Lösung. Man kann den
spezial Befehl (?| ) verwenden. Alle Gruppen,
die sich innerhalb davon befinden, werden die
gleiche Nummer haben.
Lassen Sie uns unseren regulären Ausdruck korrigieren
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Und nun wird unser Jahr definitiv in der Gruppe mit der Nummer eins sein:
<?php
$year = $res[1];
?>
Es sind Zeichenketten mit Datumsangaben gegeben, in denen das Jahr
sich von 1990 bis 2099 ändern kann:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Legen Sie für jedes Datum den Tag in die erste Gruppe, den Monat in die zweite und die letzten beiden Ziffern des Jahres - in die dritte.