PHP-də regex-də ümumi cib nömrəsi
Aşağıdakı vəziyyəti nəzərdən keçirək. Tutaq ki, bizim
dəyişə bilən bir il dəyişənimiz var,
1990-dan 2099-a qədər.
Tutaq ki, ilin son iki rəqəmini
cibdə almaq istəyirik. Uyğun regex-i yazaq:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Lakin burada bizi bir narahatlıq gözləyir. Məsələ ondadır ki, keçən əsr illəri üçün iki rəqəm birinci cibə düşəcək, ikinci əsr illəri üçün isə - ikinciyə. Nümunələr üzərində baxaq.
Budur birinci variant:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Budur ikinci variant:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
İndi tutaq ki, tapılan rəqəmləri il dəyişəninə yazmaq istəyirik. Bizi problem gözləyir, çünki məlumatları cibdən hansı açar ilə götürəcəyimizi dəqiq bilmirik:
<?php
$year = $res[1]; // 1 və ya 2 açarı lazımdır
?>
Problemi şərt ilə həll etmək olar:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Lakin daha sadə bir həll var.
Xüsusi (?| ) komandasından istifadə etmək olar.
Onun içində olan bütün ciblər
eyni nömrəyə sahib olacaq.
Gəlin regex-imizi düzəldək
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
İndi isə ilimiz mütləq bir nömrəli cibdə olacaq:
<?php
$year = $res[1];
?>
İli 1990-dan 2099-a qədər dəyişə bilən
tarixləri olan sətirlər verilmişdir:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Hər bir tarix üçün günü birinci cibə, ayi ikinciyə, ilin son iki rəqəmini isə - üçüncüyə qoyun.