Ονομασμένα groups στις κανονικές εκφράσεις της PHP
Ας υποθέσουμε ότι χρησιμοποιώντας την preg_match θέλουμε
να διαχωρίσουμε μια ημερομηνία σε ημέρα, μήνα και έτος. Θα χρησιμοποιήσουμε
για αυτό groups:
<?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']
?>
Όπως βλέπετε, στο αποτέλεσμα παίρνουμε έναν πίνακα, στον οποίο στο μηδενικό στοιχείο θα είναι ολόκληρη η ημερομηνία, στο πρώτο - το έτος, στο δεύτερο - ο μήνας, στο τρίτο - η ημέρα.
Ωστόσο, μερικές φορές, θα ήταν βολικό να πάρουμε το περιεχόμενο των groups σε μορφή associative πίνακα. Δηλαδή στην περίπτωσή μας θα ήταν καλό να πάρουμε έναν πίνακα όπως ο ακόλουθος:
[
'year' => '2025',
'month' => '10',
'day' => '29'
]
Για αυτό, στις κανονικές εκφράσεις υπάρχει ειδική
σύνταξη. Εδώ είναι: (?<name>pattern),
όπου pattern - είναι η κανονική έκφραση, και name
- είναι το όνομα του group.
Ας ξαναγράψουμε την κανονική έκφραση για την ημερομηνία χρησιμοποιώντας ονομασμένα groups:
<?php
$str = '2025-10-29';
$reg = '#(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})#';
preg_match($reg, $str, $match);
var_dump($match);
?>
Στο αποτέλεσμα θα πάρουμε έναν associative πίνακα, στον οποίο τα κλειδιά θα είναι τα ονόματα των groups, και οι τιμές - αυτά που πέρασαν μέσα σε αυτά:
[
'year' => '2025',
'month' => '10',
'day' => '29',
]
Στην πραγματικότητα, στον πίνακα με το αποτέλεσμα οι τιμές
των groups θα είναι διαθέσιμες τόσο με βάση το όνομα, όσο
και με βάση τον τακτικό αριθμό. Δηλαδή, για παράδειγμα,
το έτος θα είναι διαθέσιμο με το κλειδί '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';
?>
Τοποθετήστε τις ώρες, τα λεπτά και τα δευτερόλεπτα σε ξεχωριστά ονομασμένα groups.
Γράψτε μια συνάρτηση, που στον πίνακα με το αποτέλεσμα θα διαγράψει όλα τα αριθμημένα groups, αφήνοντας μόνο τα ονομασμένα.