Κοινός αριθμός θυσακών σε κανονικές εκφράσεις PHP
Ας εξετάσουμε την ακόλουθη κατάσταση. Ας υποθέσουμε ότι έχουμε
μια μεταβλητή με ένα έτος, που μπορεί να ποικίλλει
από 1990 έως 2099.
Ας υποθέσουμε ότι θέλουμε να πάρουμε τα δύο τελευταία ψηφία
του έτους σε έναν θύλακο. Ας γράψουμε την αντίστοιχη κανονική έκφραση:
<?php
$reg = '#19(9\d)|20(\d\d)#';
?>
Ωστόσο, εδώ αντιμετωπίζουμε μια δυσκολία. Το γεγονός είναι ότι για τα έτη του περασμένου αιώνα, τα δύο ψηφία θα μπουν στον πρώτο θύλακο, ενώ για τα έτη του επόμενου αιώνα - στον δεύτερο. Ας δούμε παραδείγματα.
Εδώ είναι η πρώτη επιλογή:
<?php
$str = '1991';
preg_match($reg, $str, $res);
var_dump($res); // [1 => '91']
?>
Και εδώ είναι η δεύτερη επιλογή:
<?php
$str = '2021';
preg_match($reg, $str, $res);
var_dump($res); // [2 => '21']
?>
Ας υποθέσουμε τώρα ότι θέλουμε να αποθηκεύσουμε τα ψηφία του έτους που βρέθηκαν σε μια μεταβλητή. Αντιμετωπίζουμε ένα πρόβλημα, αφού δεν γνωρίζουμε ακριβώς με ποιο κλειδί να πάρουμε τα δεδομένα από τον θύλακο:
<?php
$year = $res[1]; // απαιτείται κλειδί είτε 1, είτε 2
?>
Μπορούμε να λύσουμε το πρόβλημα με μια συνθήκη:
<?php
if (!empty($res[1])){
$year = $res[1];
} else{
$year = $res[2];
}
?>
Ωστόσο, υπάρχει μια απλούστερη λύση. Μπορούμε να χρησιμοποιήσουμε
μια ειδική εντολή (?| ). Όλοι οι θύλακοι
που βρίσκονται μέσα σε αυτήν θα έχουν
τον ίδιο αριθμό.
Ας διορθώσουμε την κανονική μας έκφραση
<?php
$reg = '#(?|19(9\d)|20(\d\d))#';
?>
Και τώρα το έτος μας σίγουρα θα βρίσκεται στον θύλακο με αριθμό ένα:
<?php
$year = $res[1];
?>
Δίνονται συμβολοσειρές με ημερομηνίες, στις οποίες το έτος μπορεί
να ποικίλλει από 1990 έως 2099:
<?php
$arr = [
'31-12-2025',
'30-11-1995',
'29-10-1990',
];
?>
Για κάθε ημερομηνία, τοποθετήστε την ημέρα στον πρώτο θύλακο, τον μήνα στον δεύτερο και τα δύο τελευταία ψηφία του έτους - στον τρίτο.