Imenovani capture grupe (karmani) u PHP regularnim izrazima
Recimo da pomoću preg_match želimo
podeliti datum na dan, mesec i godinu. Koristićemo
za ovo capture grupe (karmane):
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // ispisaće ['2025-10-29', '2025', '10', '29']
?>
Kao što vidite, kao rezultat dobijamo niz, u kojem će na nultom elementu biti ceo datum, na prvom - godina, na drugom - mesec, na trećem - dan.
Ponekad, međutim, bilo bi zgodno dobiti sadržaj capture grupa (karmana) kao asocijativni niz. To jest u našem slučaju bilo bi lepo dobiti ovakav niz:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Za ovo u regularnim izrazima postoji specijalna
sintaksa. Evo je: (?<name>pattern),
gde je pattern - regularni izraz, a name
- ime capture grupe (karmana).
Hajde da prepišemo naš regularni izraz za datum preko imenovanih capture grupa (karmana):
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Kao rezultat ćemo dobiti asocijativni niz, u kojem će ključevi biti imena capture grupa (karmana), a vrednosti - ono što je u njih upalo:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
U stvari, u nizu sa rezultatom vrednosti
capture grupa (karmana) će biti dostupne i po imenu, i
po rednom broju. To jest, na primer,
godina će biti dostupna po ključu 'year'
i po broju 1, mesec - po ključu 'month'
i po broju 2 i tako dalje:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Opisane imenovane capture grupe (karmani) imaju još nekoliko
alternativnih sintaksi: (?P<name>pattern)
i (?'name'pattern).
Dat je string sa vremenom:
<?php
$str = '12:59:59';
?>
Stavite sate, minute i sekunde u zasebne imenovane capture grupe (karmane).
Napišite funkciju koja u nizu sa rezultatom obriše sve numerisane capture grupe (karmane), ostavivši samo imenovane.