Elnevezett zsebek a PHP reguláris kifejezéseiben
Tegyük fel, hogy a preg_match segítségével
egy dátumot szeretnénk felbontani napra, hónapra és évre. Használjunk
ehhez zsebeket:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // kiírja: ['2025-10-29', '2025', '10', '29']
?>
Amint láthatod, az eredmény egy tömb, amelynek nulladik eleme a teljes dátum, az elsőben - az év, a másodikban - a hónap, a harmadikban - a nap lesz.
Időnként azonban kényelmesebb lenne a zsebek tartalmát asszociatív tömbként kapni. Vagyis a mi esetünkben jó lenne ilyen tömböt kapni:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Ehhez a reguláris kifejezésekben létezik egy speciális
szintaxis. Íme: (?<name>pattern),
ahol pattern - maga a reguláris kifejezés, name
pedig a zseb neve.
Írjuk át a dátumra vonatkozó reguláris kifejezésünket elnevezett zsebekkel:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Ennek eredményeképpen egy asszociatív tömböt kapunk, amelyben a kulcsok a zsebek nevei, az értékek pedig az, ami beléjük került:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Valójában az eredménytömbben a zsebek értékei
mind név, mind sorszám alapján elérhetők lesznek. Vagyis például
az év elérhető lesz a 'year' kulccsal
és a 1 számmal, a hónap - a 'month' kulccsal
és a 2 számmal, és így tovább:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Az leírt elnevezett zsebeknek van még néhány
alternatív szintaxisuk: (?P<name>pattern)
és (?'name'pattern).
Adott egy időt tartalmazó sztring:
<?php
$str = '12:59:59';
?>
Helyezd az órákat, perceket és másodperceket külön elnevezett zsebekbe.
Írj egy függvényt, amely az eredménytömbből eltávolítja az összes számozott zsebet, meghagyva csak az elnevezetteket.