Pomenované zachytávacie skupiny v regulárnych výrazoch PHP
Povedzme, že pomocou preg_match chceme
rozdeliť dátum na deň, mesiac a rok. Použime
na to zachytávacie skupiny:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // vypíše ['2025-10-29', '2025', '10', '29']
?>
Ako vidíte, vo výsledku dostaneme pole, v ktorom v nultom prvku bude celý dátum, v prvom - rok, v druhom - mesiac, v treťom - deň.
Niekedy by však bolo vhodné získať obsah zachytávacích skupín vo forme asociatívneho poľa. To znamená, že v našom prípade by bolo fajn získať takéto pole:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Na to v regulárnych výrazoch existuje špeciálna
syntax. Tu je: (?<name>pattern),
kde pattern - je regulárny výraz, a name
- je názov zachytávacej skupiny.
Prepíšme náš regulárny výraz pre dátum pomocou pomenovaných zachytávacích skupín:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Výsledkom bude asociatívne pole, v ktorom kľúče budú mená zachytávacích skupín, a hodnoty - to, čo sa do nich dostalo:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
V skutočnosti budú hodnoty zachytávacích skupín v poli s výsledkom
dostupné ako podľa mena, tak
a podľa poradového čísla. To znamená, že napríklad
rok bude dostupný pod kľúčom 'year'
a pod číslom 1, mesiac - pod kľúčom 'month'
a pod číslom 2 a tak ďalej:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Opísané pomenované zachytávacie skupiny majú ešte niekoľko
alternatívnych syntaxí: (?P<name>pattern)
a (?'name'pattern).
Daný reťazec s časom:
<?php
$str = '12:59:59';
?>
Uložte hodiny, minúty a sekundy do samostatných pomenovaných zachytávacích skupín.
Napíšte funkciu, ktorá v poli s výsledkom odstráni všetky číslované zachytávacie skupiny, pričom ponechá iba pomenované.