PHP Regular Ifodalarida Umumiy Karmon Raqamlari
Quyidagi vaziyatni ko'rib chiqaylik. Faraz qilaylik, bizda
o'zgaruvchi bor, uning yili 1990 dan 2099 gacha
o'zgarishi mumkin.
Faraz qilaylik, biz yilning oxirgi ikkita raqamini
karmonga olishni xohlaymiz. Tegishli regular ifodani yozamiz:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Biroq, bu yerda bizni bir noqulaylik kutmoqda. Gap shundaki, o'tgan asr yillari uchun ikkita raqam birinchi karmonga tushadi, ammo ikkinchi asr yillari uchun - ikkinchisiga. Keling, misollar orqali ko'rib chiqaylik.
Mana birinchi variant:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Mana ikkinchi variant:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Endi faraz qilaylik, biz topilgan yil raqamlarini o'zgaruvchiga yozmoqchimiz. Bizni muammo kutmoqda, chunki biz karmondan ma'lumotlarni qaysi kalit bilan olishimiz anig emas:
<?php
$year = $res[1]; // 1 yoki 2 kalit kerak
?>
Muammoni shart orqali hal qilish mumkin:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Biroq, soddaroq yechim mavjud. Maxsus (?| )
komandasidan foydalanish mumkin. Uning ichidagi barcha karmonlar
bitta raqamga ega bo'ladi.
Keling, bizning regular ifodamizni tuzatamiz
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Va endi bizning yilimiz aniq bir raqamli karmonda bo'ladi:
<?php
$year = $res[1];
?>
Sanalar bilan berilgan satrlar, ulardagi yil
1990 dan 2099 gacha o'zgarishi mumkin:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Har bir sana uchun kunni birinchi karmonga, oyni ikkinchisiga, yilning oxirgi ikkita raqamini esa uchinchisiga qo'ying.