Pojmenované zachytávací skupiny v regulárních výrazech PHP
Předpokládejme, že pomocí preg_match chceme
rozdělit datum na den, měsíc a rok. Použijeme
k tomu zachytávací 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']
?>
Jak vidíte, ve výsledku dostaneme pole, ve kterém bude na nultém prvku celé datum, na prvním - rok, na druhém - měsíc, na třetím - den.
Někdy by však bylo vhodné získat obsah zachytávacích skupin ve formě asociativního pole. To znamená, že v našem případě by bylo dobré získat takovýto pole:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
K tomu existuje v regulárních výrazech speciální
syntax. Zde je: (?<name>pattern),
kde pattern - to je regulární výraz, a name
- to je název zachytávací skupiny.
Přepišme náš regulární výraz pro datum pomocí pojmenovaných zachytávacích skupin:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Ve výsledku dostaneme asociativní pole, ve kterém budou klíče jména zachytávacích skupin, a hodnoty - to, co se do nich zachytilo:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Ve skutečnosti budou hodnoty zachytávacích skupin v poli s výsledkem dostupné
jak podle jména, tak
podle pořadového čísla. To znamená, že například
rok bude dostupný pod klíčem 'year'
a pod číslem 1,
měsíc - pod klíčem 'month'
a pod číslem 2 a tak dále:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Popsané pojmenované zachytávací skupiny mají ještě několik
alternativních syntaxí: (?P<name>pattern)
a (?'name'pattern).
Je dána řetězec s časem:
<?php
$str = '12:59:59';
?>
Uložte hodiny, minuty a sekundy do jednotlivých pojmenovaných zachytávacích skupin.
Napište funkci, která v poli s výsledkem odstraní všechny číslované zachytávací skupiny, ponechá pouze pojmenované.