Αποφυγή ειδικών χαρακτήρων στις κανονικές εκφράσεις της PHP
Ας υποθέσουμε ότι θέλουμε ένας ειδικός χαρακτήρας να αντιπροσωπεύει τον εαυτό του. Για αυτό πρέπει να αποφυγεί χρησιμοποιώντας την ανάστροφη πλάγια παύλα. Ας δούμε μερικά παραδείγματα.
Παράδειγμα
Στο επόμενο παράδειγμα ο συγγραφέας της κανονικής έκφρασης ήθελε
το μοτίβο αναζήτησης να μοιάζει με αυτό: το γράμμα
'a', μετά το σύμβολο συν '+', μετά
το γράμμα 'x'. Ωστόσο, ο συγγραφέας του κώδικα
δεν απέφυγε τον χαρακτήρα '+' και επομένως
το μοτίβο αναζήτησης στην πραγματικότητα μοιάζει με αυτό:
το γράμμα 'a' μία ή περισσότερες φορές, μετά
το γράμμα 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Ως αποτέλεσμα στη μεταβλητή θα καταγραφεί το ακόλουθο:
'a+x ! ! !'
Παράδειγμα
Και τώρα ο συγγραφέας απέφυγε το σύμβολο συν με ανάστροφη
πλάγια παύλα. Τώρα το μοτίβο αναζήτησης μοιάζει
όπως πρέπει: το γράμμα 'a', μετά το σύμβολο συν
'+', μετά το γράμμα 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Ως αποτέλεσμα στη μεταβλητή θα καταγραφεί το ακόλουθο:
'! ax aax aaax'
Παράδειγμα
Σε αυτό το παράδειγμα το μοτίβο μοιάζει με αυτό: το γράμμα
'a', μετά η τελεία '.', μετά
το γράμμα 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Ως αποτέλεσμα στη μεταβλητή θα καταγραφεί το ακόλουθο:
'! abx azx'
Παράδειγμα
Στο επόμενο παράδειγμα ο συγγραφέας ξέχασε να αποφύγει την τελεία και η κανονική έκφραση πέρασε όλες τις υποσυμβολοσειρές, καθώς η μη αποφυγμένη τελεία αντιπροσωπεύει οποιονδήποτε χαρακτήρα:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Ως αποτέλεσμα στη μεταβλητή θα καταγραφεί το ακόλουθο:
'! ! !'
Παράδειγμα
Παρατηρήστε ότι αν ξεχάσετε την ανάστροφη πλάγια παύλα για την τελεία (όταν θα πρέπει να αντιπροσωπεύει τον εαυτό της) - αυτό μπορεί κανείς να μην το παρατηρήσει:
<?php
preg_replace('#a.x#', '!', 'a.x'); // θα επιστρέψει '!', όπως θέλαμε
?>
Οπτικά λειτουργεί σωστά (καθώς η τελεία
αντιπροσωπεύει οποιονδήποτε χαρακτήρα, συμπεριλαμβανομένης και της συνηθισμένης
τελείας '.'). Αλλά αν αλλάξουμε τη συμβολοσειρά,
στην οποία γίνονται οι αντικαταστάσεις - θα δούμε το
λάθος μας:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // θα επιστρέψει '! ! !', αλλά αναμέναμε '! abx azx'
?>