A zsebek összeszámlálásának módja a PHP reguláris kifejezéseiben
Vizsgáljuk meg a következő helyzetet. Tegyük fel, hogy van
egy változónk egy évvel, amely változhat
1990 és 2099 között.
Tegyük fel, hogy az év utolsó két számjegyét szeretnénk
megkapni egy zsebben. Írjuk meg a megfelelő reguláris kifejezést:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Itt azonban vár ránk egy kellemetlenség. Az a helyzet, hogy az elmúlt század éveire a két számjegy az első zsebbe kerül, míg a második század éveire - a másodikba. Nézzük meg példákon.
Itt az első változat:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
És itt a második változat:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Tegyük fel most, hogy a talált év számjegyeit egy változóba szeretnénk menteni. Probléma vár ránk, hiszen nem tudjuk pontosan, melyik kulccsal vegyük ki az adatokat a zsebből:
<?php
$year = $res[1]; // 1-es vagy 2-es kulcs kell
?>
A probléma megoldható feltétellel:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Van azonban egy egyszerűbb megoldás is. Használhatjuk
a speciális (?| ) parancsot. Minden zseb,
amely ezen belül van, ugyanazt a számot kapja.
Javítsuk a reguláris kifejezésünket
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
És most az évünk biztosan az egyes számú zsebben lesz:
<?php
$year = $res[1];
?>
Adottak dátumokat tartalmazó sztringek, amelyekben az év
változhat 1990 és 2099 között:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Minden dátum esetén tegye a napot az első zsebbe, a hónapot a másodikba, az év utolsó két számjegyét pedig a harmadikba.