Üldine taskute arv regulaaravaldistes PHP-s
Vaatleme järgmist olukorda. Oletame, et meil
on muutuja aastaga, mis võib muutuda
alates 1990 kuni 2099.
Oletame, et tahame saada aasta kahte viimast numbrit
taskusse. Kirjutame vastava regulaaravaldise:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Siiski ootab meid siin üks ebamugavus. Asi on selles, et möödunud sajandi aastate puhul kaks numbrit satuvad esimesse taskusse, aga teise sajandi aastate puhul - teise. Vaatame näidetel.
Siin on esimene variant:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Ja siin on teine variant:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Oletame nüüd, et tahame leitud aasta numbrid kirjutada muutujasse. Meid ootab probleem, sest me ei tea täpselt, millise võtmega andmeid taskust võtta:
<?php
$year = $res[1]; // vaja võtit kas 1 või 2
?>
Probleemi saab lahendada tingimuslausega:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Siiski on olemas lihtsam lahendus. Saab kasutada
spetsiaalset käsku (?| ). Kõik taskud,
mis asuvad selle sees, saavad ühe numbri.
Parandame oma regulaaravaldist
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Ja nüüd on meie aasta kindlasti taskus number üks:
<?php
$year = $res[1];
?>
Antud on stringid kuupäevadega, milles aasta võib
muutuda alates 1990 kuni 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Iga kuupäeva puhul pange päev esimesse taskusse, kuu teise, ja aasta kaks viimast numbrit - kolmandasse.