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',
];
?>
ყოველი თარიღისთვის მოათავსეთ დღე პირველ ჯიბეში, თვე მეორეში, ხოლო წლის ბოლო ორი ციფრი - მესამეში.