Totalt antal fickor i PHP reguljära uttryck
Låt oss överväga följande situation. Antag att vi
har en variabel med ett år som kan variera
från 1990 till 2099.
Antag att vi vill få de två sista siffrorna
av året i en ficka. Låt oss skriva motsvarande reguljära uttryck:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Här väntar dock ett bekymmer på oss. Saken är att för århundraden som har passerat kommer de två siffrorna att hamna i den första fickan, medan för århundraden som kommer - i den andra. Låt oss titta på exempel.
Här är det första alternativet:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Och här är det andra alternativet:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Antag nu att vi vill skriva de hittade årsiffrorna till en variabel. Då väntar ett problem, för vi vet inte exakt med vilken nyckel vi ska hämta data från fickan:
<?php
$year = $res[1]; // behöver nyckel antingen 1, eller 2
?>
Problemet kan lösas med ett villkor:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Det finns dock en enklare lösning. Man kan använda
ett speciellt kommando (?| ). Alla fickor
som finns inuti den kommer att ha
samma nummer.
Låt oss rätta till vårt reguljära uttryck
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Och nu kommer vårt år säkert att vara i fickan med nummer ett:
<?php
$year = $res[1];
?>
Givna strängar med datum, där året kan
variera från 1990 till 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
För varje datum, sätt dagen i den första fickan, månaden i den andra, och de två sista siffrorna i året - i den tredje.