Іменаваныя карманы ў рэгулярках PHP
Хай з дапамогай preg_match
мы хочам
разбіць дату на дзень, месяц і год. Выкарастаем
для гэтага карманы:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // выведзе ['2025-10-29', '2025', '10', '29']
?>
Як вы бачыце, у выніку мы атрымліваем масіў, у якім у нулявым элеменце будзе ўся дата, у першым - год, у другім - месяц, у трэцім - дзень.
Часам, аднак, было б зручна атрымаць змесціва карманаў у выглядзе асацыятыўнага масіва. Гэта значыць у нашым выпадку было б добра атрымаць вось такі масіў:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Для гэтага ў рэгулярках існуе спецыяльны
сінтаксіс. Вось ён: (?<name>pattern)
,
дзе pattern
- гэта рэгулярка, а name
- гэта імя кармана.
Давайце перапішам нашу рэгулярку для даты праз іменаваныя карманы:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
У выніку ў нас атрымаецца асацыятыўны масіў, у якім ключамі будуць імёны карманаў, а значэннямі - тое, што ў іх трапіла:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
На самай справе ў масіве з вынікам значэнні
карманаў будуць даступныя як па імі, так
і па парадкавым нумары. Гэта значыць, напрыклад,
год будзе даступны па ключы 'year'
і па нумары 1
, месяц - па ключы 'month'
і па нумары 2
і так далей:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Апісаныя іменаваныя карманы маюць яшчэ некалькі
альтэрнатыўных сінтаксісаў: (?P<name>pattern)
і (?'name'pattern)
.
Дадзена радок з часам:
<?php
$str = '12:59:59';
?>
Пакладзеце гадзіны, хвіліны і секунды ў асобныя іменаваныя карманы.
Напішыце функцыю, якая ў масіве з вынікам выдаліць усе нумараваныя карманы, пакінуўшы толькі іменаваныя.