Samlet antal lommer i PHP regulære udtryk
Lad os overveje følgende situation. Antag, at vi
har en variabel med et år, som kan ændre sig
fra 1990 til 2099.
Lad os sige, at vi ønsker at få de sidste to cifre
af året i en lomme. Lad os skrive det tilsvarende regulære udtryk:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Her venter der os dog en ulempe. Faktum er, at for årene i det forrige århundrede vil de to cifre ende i den første lomme, mens for årene i det næste århundrede - i den anden. Lad os se på eksempler.
Her er den første mulighed:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Og her er den anden mulighed:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Lad os nu antage, at vi ønsker at skrive de fundne årstal i en variabel. Vi står over for et problem, for vi ved ikke nøjagtigt, hvilken nøgle vi skal tage dataene fra lommen med:
<?php
$year = $res[1]; // skal have nøglen enten 1 eller 2
?>
Problemet kan løses med en betingelse:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Der er dog en enklere løsning. Du kan bruge
et specielt kommando (?| ). Alle lommer,
som er inde i den, vil have
det samme nummer.
Lad os rette vores regulære udtryk
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Og nu vil vores år bestemt være i lommen med nummer et:
<?php
$year = $res[1];
?>
Der gives strenge med datoer, hvor året kan
ændre sig fra 1990 til 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
For hver dato, læg dagen i den første lomme, måneden i den anden, og de sidste to cifre af året - i den tredje.