Παύλα εντός συνόλων στις κανονικές εκφράσεις της PHP
Η παύλα - είναι επίσης ειδικός χαρακτήρας εντός []
(ενώ έξω - όχι). Εάν χρειάζεστε την ίδια την παύλα ως χαρακτήρα
- τότε τοποθετήστε την σε θέση, όπου δεν θα γίνει αντιληπτή ως διαχωριστής
ομάδας.
Γιατί αυτό είναι σημαντικό: μπορείτε να δημιουργήσετε μια ομάδα
χαρακτήρων, χωρίς να το καταλάβετε. Για παράδειγμα,
έτσι - [:-@] - εσείς νομίζετε ότι
επιλέγετε την άνω και κάτω τελεία, την παύλα και το σύμβολο @, αλλά
στην πραγματικότητα προκύπτει μια ομάδα χαρακτήρων μεταξύ
: και @. Σε αυτήν την ομάδα περιλαμβάνονται
οι ακόλουθοι χαρακτήρες: :, ;, ?,
<, =, >.
Από πού προέρχονται; Από τον πίνακα ASCII - η άνω και κάτω τελεία έχει μικρότερο αριθμό από το σύμβολο @ - και προκύπτει ομάδα. Δηλαδή όλες οι ομάδες προκύπτουν βάσει του πίνακα ASCII (αν θέλετε μπορείτε να το χρησιμοποιήσετε αυτό).
Πώς να το αντιμετωπίσετε: τοποθετήστε τον χαρακτήρα παύλας
σε θέση, όπου σίγουρα δεν θα γίνει αντιληπτός ως
χαρακτήρας ομάδας, για παράδειγμα, στην αρχή ή στο τέλος
(δηλαδή μετά το [ ή πριν από το ]).
Μπορείτε επίσης να δώσετε escape στην παύλα - τότε
θα συμβολίζει τον εαυτό της ανεξάρτητα από τη
θέση. Για παράδειγμα, αντί για [:-@] να γράψετε
[:\-@] - και δεν θα υπάρχει πλέον ομάδα, αλλά
θα υπάρχουν τρεις χαρακτήρες - άνω και κάτω τελεία, παύλα και σύμβολο @.
Παράδειγμα
Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι το εξής:
ψηφίο 1, στη συνέχεια γράμμα από 'a'
έως 'z', στη συνέχεια ψηφίο 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Στο αποτέλεσμα στη μεταβλητή θα καταγραφεί το εξής:
'! 1-2 ! !'
Παράδειγμα
Ας κάνουμε τώρα escape στην παύλα. Στο αποτέλεσμα
το μοτίβο αναζήτησης είναι το εξής: ψηφίο 1, στη συνέχεια
γράμμα 'a', ή παύλα, ή γράμμα 'z',
στη συνέχεια ψηφίο 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Στο αποτέλεσμα στη μεταβλητή θα καταγραφεί το εξής:
'! ! 1c2 !'
Παράδειγμα
Μπορείτε απλά να μετακινήσετε την παύλα, χωρίς να της κάνετε escape:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Στο αποτέλεσμα στη μεταβλητή θα καταγραφεί το εξής:
'! ! 1c2 !'
Παράδειγμα
Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι το εξής:
πρώτος χαρακτήρας - αυτός είναι μικρά γράμματα ή
παύλα '-', μετά δύο γράμματα 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Στο αποτέλεσμα στη μεταβλητή θα καταγραφεί το εξής:
'! Axx ! @xx'
Παράδειγμα
Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι το εξής:
πρώτος χαρακτήρας - αυτός είναι μικρά, κεφαλαία
γράμματα ή παύλα '-', μετά δύο γράμματα
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Στο αποτέλεσμα στη μεταβλητή θα καταγραφεί το εξής:
'! ! ! @xx'
Παράδειγμα
Μπορείτε να τοποθετήσετε την παύλα ανάμεσα σε δύο ομάδες - εκεί σίγουρα δεν θα δημιουργήσει μια ακόμη ομάδα:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Στο αποτέλεσμα στη μεταβλητή θα καταγραφεί το εξής:
'! ! ! @xx'
Πρακτικές ασκήσεις
Δίνεται μια συμβολοσειρά:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Βρείτε όλες τις συμβολοσειρές σύμφωνα με το ακόλουθο μοτίβο:
γράμμα 'x', κεφαλαίο ή μικρό
γράμμα ή παύλα, γράμμα 'z'.
Δίνεται μια συμβολοσειρά:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Βρείτε όλες τις συμβολοσειρές σύμφωνα με το ακόλουθο μοτίβο:
γράμμα 'x', στη συνέχεια ή δολάριο, ή
παύλα ή συν, μετά γράμμα 'z'.