PHP Regular Ifodalarida Umumiy Karmon Raqami
Куйидаги вазиятни кўриб чикайлик. Фарз килайлик, бизда
ўзгариши мумкин бўлган йил ўзгаргучиси бор, у
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',
];
?>
Ҳар бир санат учун кунни биринчи карманга, ойни иккинчи карманга, сўнги икки йил рақамини эса - учинчи карманга қўйинг.