Kopējais numuru kabatu regulārajās izteiksmēs PHP
Apskatīsim šādu situāciju. Pieņemsim, ka mums
ir mainīgais ar gadu, kas var mainīties
no 1990 līdz 2099.
Pieņemsim, ka mēs vēlamies iegūt pēdējos divus ciparus
gada kabatā. Uzrakstīsim atbilstošu regulāro izteiksmi:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Tomēr šeit mūs sagaida viena neērtība. Lieta ir tāda, ka pagājušā gadsimta gadiem divi cipari nonāks pirmajā kabatā, bet otrā gadsimta gadiem - otrajā. Apskatīsim ar piemēriem.
Lūk, pirmais variants:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Un lūk, otrais variants:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Pieņemsim, ka mēs tagad vēlamies ierakstīt atrastos gada ciparus mainīgajā. Mūs sagaida problēma, jo mēs nezinām precīzi, ar kuru atslēgu paņemt datus no kabatas:
<?php
$year = $res[1]; // nepieciešama atslēga 1 vai 2
?>
Problēmu var atrisināt ar nosacījumu:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Tomēr ir vienkāršāks risinājums. Var izmantot
īpašo komandu (?| ). Visas kabatas,
kas atrodas tajā iekšpusē, būs ar
vienu numuru.
Izlabosim mūsu regulāro izteiksmi
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Un tagad mūsu gads noteikti būs kabatā ar numuru viens:
<?php
$year = $res[1];
?>
Dotas virknes ar datumiem, kuros gads var
mainīties no 1990 līdz 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Katram datumam ievietojiet dienu pirmajā kabatā, mēnesi otrajā, bet pēdējos divus gada ciparus - trešajā.