Algemene nommer van sakke in PHP gereelde uitdrukkings
Beskou die volgende situasie. Kom ons sê ons het
'n veranderlike met 'n jaar wat kan wissel
vanaf 1990 tot 2099.
Kom ons sê ons wil die laaste twee syfers
van die jaar in 'n sak kry. Laat ons die ooreenstemmende gereelde uitdrukking skryf:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Hier wag eger 'n ongerief op ons. Die ding is dat vir jare van die vorige eeu die twee syfers in die eerste sak sal beland, en vir jare van die tweede eeu - in die tweede een. Laat ons kyk na voorbeelde.
Hier is die eerste variant:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
En hier is die tweede variant:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Kom ons sê ons wil nou die gevind syfers van die jaar in 'n veranderlike skryf. Ons wag 'n probleem, aangesien ons nie presies weet met watter sleutel om die data uit die sak te haal nie:
<?php
$year = $res[1]; // 'n sleutel van of 1, of 2 word benodig
?>
Die probleem kan opgelos word deur 'n voorwaarde:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Daar is eger 'n eenvoudiger oplossing. Die spesiale opdrag
(?| ) kan gebruik word. Alle sakke
wat binne dit geleë is sal dieselfde
nommer hê.
Kom ons reg ons gereelde uitdrukking
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
En nou sal ons jaar definitief in die sak met nommer een wees:
<?php
$year = $res[1];
?>
Daar is stringe met datums, waarin die jaar kan
wissel vanaf 1990 tot 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Vir elke datum, plaas die dag in die eerste sak, die maand in die tweede, en die laaste twee syfers van die jaar - in die derde een.