Totalt antall lommer i regex i PHP
La oss vurdere følgende situasjon. Anta at vi
har en variabel med et år som kan variere
fra 1990 til 2099.
Anta at vi ønsker å få de to siste sifrene
i året i en lomme. La oss skrive det tilsvarende regulære uttrykket:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Her venter imidlertid en ulempe på oss. Saken er at for årene i forrige århundre vil de to sifrene havne i den første lommen, mens for årene i det andre århundret - i den andre. La oss se på eksempler.
Her er det første alternativet:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Og her er det andre alternativet:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Anta nå at vi ønsker å skrive de funnet årets sifrer inn i en variabel. Vi står overfor et problem, for vi vet ikke nøyaktig med hvilken nøkkel vi skal hente dataene fra lommen:
<?php
$year = $res[1]; // trenger nøkkel enten 1 eller 2
?>
Problemet kan løses med en betingelse:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Det finnes imidlertid en enklere løsning. Du kan bruke
en spesiell kommando (?| ). Alle lommer
som er innenfor den vil ha
ett nummer.
La oss korrigere vårt regulære uttrykk
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Og nå vil året vårt definitivt være i lommen med nummer én:
<?php
$year = $res[1];
?>
Det gis strenger med datoer, der året kan
variere fra 1990 til 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
For hver dato, legg dagen i den første lommen, måneden i den andre, og de to siste sifrene i året - i den tredje.