PHP регулярдык туюнтмаларындагы кармандардын жалпы номери
Төмөнкү жagдайды карап көрөлү. Бизде өзгөрүп турган жыл
өзгөрмөсү бар дейли, ал 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',
];
?>
Ар бир дата үчүн күндү биринчи карманга, айды экинчи карманга, ал эми жылдын акыркы эки цифрасын - үчүнчү карманга салыңыз.