Ընդհանուր համարի գրպանները PHP-ի կանոնավոր արտահայտություններում
Դիտարկենք հետևյալ իրավիճակը. Ենթադրենք ունենք
տարվա հետ կապված փոփոխական, որը կարող է փոխվել
1990-ից մինչև 2099:
Ենթադրենք, մենք ցանկանում ենք ստանալ տարվա վերջին երկու թվանշանները
գրպանում: Գրենք համապատասխան կանոնավոր արտահայտություն.
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Սակայն, այստեղ մեզ սպասվում է մի անհարմարություն: Բանը նրանում է, որ անցյալ դարի տարիների համար երկու թվանշանը կընկնի առաջին գրպանը, իսկ երկրորդ դարի տարիների համար՝ երկրորդը: Դիտարկենք օրինակներով:
Ահա առաջին տարբերակը.
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Իսկ ահա երկրորդ տարբերակը.
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Ենթադրենք հիմա, որ մենք ցանկանում ենք գտնված տարվա թվանշանները գրել փոփոխականի մեջ: Մեզ սպասվում է խնդիր, քանի որ մենք հստակ չգիտենք, թե որ բանալիով վերցնել տվյալները գրպանից.
<?php
$year = $res[1]; // պետք է բանալին՝ 1 կամ 2
?>
Խնդիրը կարելի է լուծել պայմանի միջոցով.
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Սակայն, կա ավելի պարզ լուծում: Կարելի է օգտագործել
հատուկ հրաման (?| ): Դրա ներսում գտնվող բոլոր գրպանները
կունենան նույն համարը:
Ուղղենք մեր կանոնավոր արտահայտությունը
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Եվ այժմ մեր տարին հաստատ կլինի մեկ համարով գրպանում.
<?php
$year = $res[1];
?>
Տրված են ամսաթիվ պարունակող տողեր, որոնցում տարին կարող է
փոխվել 1990-ից մինչև 2099.
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Յուրաքանչյուր ամսաթվի համար տեղադրեք օրը առաջին գրպանում, ամիսը՝ երկրորդում, իսկ տարվա վերջին երկու թվանշանները երրորդում: