Nazwane kieszenie w wyrażeniach regularnych PHP
Załóżmy, że za pomocą preg_match chcemy
rozbić datę na dzień, miesiąc i rok. Użyjemy do tego
kieszeni:
<?php
$str = '2025-10-29';
$reg = '#(\d{4})-(\d{2})-(\d{2})#';
preg_match($reg, $str, $match);
var_dump($match); // wypisze ['2025-10-29', '2025', '10', '29']
?>
Jak widzicie, w wyniku otrzymujemy tablicę, w której w zerowym elemencie będzie cała data, w pierwszym - rok, w drugim - miesiąc, w trzecim - dzień.
Czasami jednak byłoby wygodnie otrzymać zawartość kieszeni w postaci tablicy asocjacyjnej. To znaczy w naszym przypadku byłoby nieźle dostać taką tablicę:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
W tym celu w wyrażeniach regularnych istnieje specjalna
składnia. Oto ona: (?<name>pattern),
gdzie pattern - to wyrażenie regularne, a name
- to nazwa kieszeni.
Przepiszmy nasze wyrażenie regularne dla daty przez nazwane kieszenie:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
W rezultacie otrzymamy tablicę asocjacyjną, w której kluczami będą nazwy kieszeni, a wartościami - to, co się w nich znalazło:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
W rzeczywistości w tablicy z wynikiem wartości
kieszeni będą dostępne zarówno po nazwie, jak
i po numerze porządkowym. To znaczy, na przykład,
rok będzie dostępny po kluczu 'year'
i po numerze 1, miesiąc - po kluczu 'month'
i po numerze 2 i tak dalej:
[
'year' => '2025',
'month' => '10',
'day' => '29',
1 => '2025',
2 => '10',
3 => '29'
]
Opisane nazwane kieszenie mają jeszcze kilka
alternatywnych składni: (?P<name>pattern)
i (?'name'pattern).
Dany jest ciąg znaków z czasem:
<?php
$str = '12:59:59';
?>
Umieść godziny, minuty i sekundy w oddzielnych nazwanych kieszeniach.
Napisz funkcję, która w tablicy z wynikiem usunie wszystkie ponumerowane kieszenie, pozostawiając tylko nazwane.