Χρησιμοποιώντας το Windows Equalizer
Αρχεία *.xlsx με παραδείγματα υπολογισμών τύπων και συναρτήσεων. Και επίσης δωρεάν...
Ας ξεκινήσουμε με το τι είναι η κανονική έκφραση. Απαντήστε μου λοιπόν σε αυτή την ερώτηση: υπάρχει «ε» στη λέξη «δοκιμή»; "Φάω!" λες. Στη συνέχεια σας κάνω μια δεύτερη ερώτηση, πώς βρήκατε το γράμμα "ε" στη λέξη "τεστ"; Η απάντηση είναι προφανής, παίρνουμε τον πρώτο χαρακτήρα, δηλαδή το “t” και τον συγκρίνουμε με αυτό που ψάχνουμε, δηλαδή με το “e”. Αν δεν είναι ίσοι, τότε παίρνουμε τον δεύτερο χαρακτήρα, δηλαδή «ε» και τον συγκρίνουμε με αυτό που ψάχνουμε, δηλαδή «ε». Voila! Βρέθηκε ένα ταίρι. Απάντηση: Η λέξη "τεστ" περιέχει το γράμμα "ε".
Τώρα απαντήστε μου μια ακόμη ερώτηση, πού βρίσκεται η κανονική έκφραση σε αυτό το παράδειγμα; Ελπίζω να μαντέψατε ότι η κανονική έκφραση εδώ είναι αυτό που αναζητούμε στη λέξη "δοκιμή". Δηλαδή, το γράμμα "e" σε αυτό το παράδειγμα είναι μια κανονική έκφραση.
Σε τι χρησιμεύουν οι τυπικές εκφράσεις στην PHP; Στην πρακτική μου, χρησιμοποιήθηκαν κανονικές εκφράσεις, για παράδειγμα, για να καθοριστεί εάν μια διεύθυνση ηλεκτρονικού ταχυδρομείου συντάχθηκε σωστά. Τέτοιες εκφράσεις χρησιμοποιούνται επίσης για τον προσδιορισμό της ορθότητας του ονόματος χρήστη και του κωδικού πρόσβασης. Χρησιμοποιώντας κανονικές εκφράσεις, μπορείτε να βρείτε τη διεύθυνση σε έναν σύνδεσμο και να την αποθηκεύσετε. Υπάρχουν πολλά πράγματα που μπορείτε να κάνετε Αναλύοντας αυτό, μπορείτε να προσδιορίσετε την κύρια λειτουργία των κανονικών εκφράσεων και δύο πλευρικές. Κύρια λειτουργία, αυτή είναι μια αναζήτηση αντιστοιχιών σε μια συμβολοσειρά. Οι παρενέργειες περιλαμβάνουν την αποθήκευση των αντιστοιχιών που βρέθηκαν και την αντικατάστασή τους.
Θεωρητικά, καταλαβαίνουμε πώς βρίσκουμε τον χαρακτήρα "e" στη λέξη "test", αλλά πώς εφαρμόζεται αυτό στην πράξη; Για να χρησιμοποιήσετε κανονικές εκφράσεις στην php, χρησιμοποιούνται συνήθως οι ακόλουθες συναρτήσεις:
preg_match("κανονική έκφραση (μοτίβο)", "μεταβλητή στην οποία εκτελείται η αναζήτηση", "Μεταβλητή στην οποία αποθηκεύεται το αποτέλεσμα αναζήτησης (προαιρετική παράμετρος)"); - Λειτουργία αντιστοίχισης
preg_replace("κανονική έκφραση (μοτίβο)", "Με τι να αντικατασταθεί η αντιστοιχία που βρέθηκε", "μεταβλητή στην οποία γίνεται η αντικατάσταση"); - Λειτουργία αντικατάστασης
Ας αρχίσουμε να χρησιμοποιούμε αυτές τις συναρτήσεις Ακολουθεί ένα παράδειγμα αναζήτησης του χαρακτήρα "e" στη λέξη "test":
$a = "δοκιμή";
if(preg_match("/e/",$a)) echo "βρέθηκε!!";
Ο κώδικας περιγράφει την συνθήκη: αν βρεθεί κάτι που ταιριάζει με το μοτίβο στη μεταβλητή $a, τότε εμφανίστε το μήνυμα "βρέθηκε!!" Όπως ίσως έχετε παρατηρήσει, το πρότυπό μας βρίσκεται ανάμεσα σε δύο "/". Σε αυτήν την περίπτωση, το σύμβολο "/" συμβολίζει την αρχή και το τέλος του σχεδίου μας. Ελπίζω ότι αυτό είναι ξεκάθαρο.
Όλα αυτά είναι ενδιαφέροντα, φυσικά... αλλά το πρότυπό μας είναι πολύ απλό, δεν νομίζετε; Εξάλλου, σπάνια χρειάζεται να βρούμε κάποιο σύμβολο σε μια μεταβλητή. Στις περισσότερες περιπτώσεις, πρέπει να βρούμε πολλούς χαρακτήρες, αλλά και άγνωστους. Πώς μπορεί να είναι αυτό; Ας θέσουμε στον εαυτό μας ένα πρόβλημα και ας προσπαθήσουμε να το λύσουμε. Ας υποθέσουμε ότι έχουμε μια συμβολοσειρά που αποτελείται από αριθμούς και ένα άγνωστο αγγλικό γράμμα
Πώς να βρείτε αυτό το γράμμα; Θα μπορούσε να υπάρχει οποιοδήποτε γράμμα του αγγλικού αλφαβήτου, οπότε πώς μπορείτε να το αναγνωρίσετε; Εσείς ο ίδιος απαντήσατε στην ερώτησή σας, υπάρχει οποιοδήποτε γράμμα, δηλαδή είναι στην περιοχή από το a έως το z. Μπορείτε να χρησιμοποιήσετε εύρη σε κανονικές εκφράσεις. Εάν δεν ξέρουμε ποιος χαρακτήρας ψάχνουμε, αλλά γνωρίζουμε σίγουρα ότι αυτός ο χαρακτήρας είναι ένα γράμμα του αγγλικού αλφαβήτου, τότε η καταχώριση θα είναι η εξής:
$a = "123a321";
if(preg_match("//",$a)) echo "βρέθηκε!!";
Σημειώστε ότι η περιοχή περικλείεται σε αγκύλες "[" "]". Όλα όσα περικλείονται σε τέτοιες αγκύλες ορίζονται ως έναςσύμβολο, σε αυτήν την περίπτωση το σύμβολο κυμαίνεται από a έως z. Εάν πρέπει να βρούμε όχι ένα γράμμα, αλλά έναν αριθμό, τότε η καταχώρηση θα είναι η εξής:
$a = "abc1cba";
if(preg_match("//",$a)) echo "βρέθηκε!!";
Θέλω επίσης να σημειώσω ότι οι τυπικές εκφράσεις κάνουν διάκριση πεζών-κεφαλαίων, επομένως οι χαρακτήρες "A" και "a" είναι εντελώς διαφορετικοί, για να αναζητήσετε και τους δύο χαρακτήρες, γράψτε ως εξής:
$a = "123a321";
if(preg_match("//",$a)) echo "βρέθηκε!!";
Υπάρχει επίσης μια αναζήτηση για ρωσικά γράμματα, που πραγματοποιείται με τον ίδιο τρόπο όπως και με τα αγγλικά:
$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "βρέθηκε!!";
Μάθαμε πώς να αναζητούμε έναν άγνωστο χαρακτήρα σε μια συμβολοσειρά. Τι να κάνουμε αν χρειαστεί να βρούμε πολλούς χαρακτήρες; Τα λεγόμενα μετασύμβολα έρχονται στη διάσωση... Ας υποθέσουμε ότι έχουμε μια συμβολοσειρά με αριθμούς και γράμματα, πώς μπορούμε να την περιγράψουμε στο πρότυπο; Μπορείτε να το κάνετε αυτό:
γραμμή - 123a321
δείγμα -
Χμμ... το πρότυπο ταιριάζει πραγματικά με τη συμβολοσειρά μας και όταν ελεγχθεί για συμμόρφωση θα δώσει την πολυαναμενόμενη αλήθεια! Αλλά είναι κάπως δυσκίνητος δίσκος, δεν νομίζετε;
Δείτε πώς μπορείτε να το συντομεύσετε:
γραμμή - 123a321
δείγμα - *
Μου φαίνεται ότι είναι πιο σύντομο Τι είναι το σύμβολο "*"; Αυτό είναι το ίδιο μετασύμβολο, σημαίνει ότι το σύμβολο που περιγράψαμε (δηλαδή, ένα σύμβολο που μπορεί να περιέχει αριθμούς από το 0 έως το 9 ή γράμματα του αγγλικού αλφαβήτου, από το a έως το z) μπορεί να επαναληφθεί επ 'αόριστον ή περισσότερες από μία φορές. Ναι ναι! Αυτό το μετασύμβολο θα βρει ταίριασμα σε μια κενή μεταβλητή, αφού ακόμη και η απουσία του συμβόλου που περιγράψαμε θα επιστρέψει αληθινή! Θυμηθείτε αυτό
Ποιοι άλλοι μεταχαρακτήρες υπάρχουν;
Για παράδειγμα, ο μεταχαρακτήρας "+" Είναι σχεδόν παρόμοιος με τον μεταχαρακτήρα "*" με μια μικρή εξαίρεση. Το "*" θα επιστρέψει true ακόμα κι αν δεν υπάρχει χαρακτήρας και το "+" θα ελέγξει για την παρουσία τουλάχιστον ενός χαρακτήρα. Αν δηλαδή μια γραμμή απαιτεί την παρουσία ελάχιστοένας χαρακτήρας και στη συνέχεια χρησιμοποιήστε "+" αντί για "*"
Ο μεταχαρακτήρας "?" χρησιμοποιείται επίσης συχνά. Σημαίνει ότι η γραμμή δεν πρέπει να περιέχει περισσότερους από έναν επιθυμητό χαρακτήρα. Επιτρέψτε μου να δώσω μερικά παραδείγματα για τους δύο τελευταίους μεταχαρακτήρες που περιέγραψα.
Ας υποθέσουμε ότι πρέπει να ελέγξουμε τον κωδικό πρόσβασης του χρήστη για ορθότητα. Ας σκεφτούμε τι πρέπει να περιέχει ο κωδικός πρόσβασης χρήστη; Λοιπόν, πρώτα, πρέπει να είναι τουλάχιστον ένας χαρακτήρας. Δεύτερον, πρέπει να περιέχει μόνο αριθμούς και γράμματα του αγγλικού αλφαβήτου, επομένως η τυπική έκφραση θα μοιάζει με αυτό:
$a = "qwerty12345";
Ποιους χαρακτήρες επιτρέπουμε; Αγγλικά γράμματα κάθε περίπτωσης και αριθμοί. Τώρα δοκιμάστε να αφήσετε μια κενή γραμμή αντί για τον κωδικό πρόσβασης.
$a = "";
if(preg_match("/+/",$a)) echo "Ο κωδικός πρόσβασης είναι σωστός";
Δεν θα δείτε το μήνυμα "Ο κωδικός πρόσβασης είναι σωστός". Γιατί; Επειδή ο μεταχαρακτήρας "+" έλεγξε τη συμβολοσειρά για να δει αν είχε τουλάχιστον έναν χαρακτήρα.
Και τώρα ένα κόλπο, ας ρίξουμε μια ματιά στην έκφρασή μας, δεν επιτρέψαμε, καλά, ας πούμε ένα κενό σε αυτό, σωστά; βάλτε ένα κενό στο τέλος του κωδικού πρόσβασης και εκτελέστε
$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Ο κωδικός πρόσβασης είναι σωστός";
Και γιατί βλέπουμε το μήνυμά μας σχετικά με τον σωστό κωδικό πρόσβασης; Είναι πολύ απλό... Συνάρτηση preg_match(); σταματά τον έλεγχο στον πρώτο αγώνα. Δηλαδή, το σύμβολο «q» ταιριάζει στο μοτίβο που περιγράψαμε και όλα τα άλλα δεν είναι πλέον σημαντικά για τη συνάρτηση Τι πρέπει να κάνουμε; Δείτε πώς μπορείτε να το διορθώσετε:
$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Ο κωδικός πρόσβασης είναι σωστός";
Προσθέτοντας ένα "^" στην αρχή μιας έκφρασης και ένα "$" στο τέλος, λέμε στη συνάρτηση τι πρέπει να ταιριάζει το μοτίβο όλοιγραμμή. Εάν εκτελέσετε αυτόν τον κωδικό, δεν θα δείτε το μήνυμα, καθώς υπάρχει ένας παράνομος χαρακτήρας στο τέλος του κωδικού πρόσβασης - ένα κενό
Τώρα αλλάξτε τον μεταχαρακτήρα "+" στον μεταχαρακτήρα "?". Τι πιστεύετε ότι θα συμβεί; Σωστά, δεν θα υπάρχει μήνυμα για την ορθότητα του κωδικού πρόσβασης, καθώς ο κωδικός πρόσβασης περιέχει περισσότερους από έναν χαρακτήρες. Ελπίζω να εξήγησα σωστά τη δουλειά αυτών των τριών συχνά χρησιμοποιούμενων μεταχαρακτόρων
Έχουμε μάθει τουλάχιστον να ελέγχουμε ότι ο κωδικός πρόσβασης είναι σωστός, και αυτό είναι καλό! Επιτρέψτε μου να σας πω για έναν άλλο τρόπο αναζήτησης για κάτι σε μια συμβολοσειρά. Ας υποθέσουμε ότι πρέπει να ελέγξουμε για την απουσία αριθμών σε μια συμβολοσειρά. Πώς να το κάνετε αυτό; Εδώ είναι η γραμμή:
(Είχα εισαγάγει συγκεκριμένα αυτά τα σύμβολα "-_+()" σε αυτό για να μην φαίνεται η ζωή σαν μέλι...) Θα μπορούσαμε να διατυπώσουμε την ακόλουθη έκφραση:
Αλλά πρέπει να παραδεχτείτε, δεν γνωρίζουμε πάντα ποιοι χαρακτήρες χρησιμοποιούνται σε μια γραμμή, αλλά γνωρίζουμε με βεβαιότητα ότι δεν πρέπει να υπάρχουν αριθμοί σε αυτήν! Θα ήταν επομένως πιο λογικό να γράψουμε απλώς ένα πρότυπο που θα παρακάμπτει τις γραμμές στις οποίες Οχιαριθμοί, και όχι αυτοί στους οποίους υπάρχουν "Θεέ μου, υπάρχουν τόσα ακατανόητα σύμβολα!!!". Ακολουθεί ένα παράδειγμα μιας σωστά συντεθειμένης έκφρασης για τέτοια προβλήματα:
$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "No numbers!";
Πώς το πετύχαμε αυτό; Έχουμε εισάγει το σύμβολο Αλλά!το καπάκι "^" ([^0-9]) που τοποθετείται στην αρχή δείχνει ότι θα υπάρχει δεν θα έπρεπεΕλπίζω να έχει διευθετηθεί αυτό
Λοιπόν, ας το ολοκληρώσουμε σιγά σιγά... Θα δώσω δύο παραδείγματα με επεξηγήσεις, κατά τη διάρκεια των οποίων θα μάθουμε πώς να αποθηκεύουμε το αποτέλεσμα αναζήτησης σε μια μεταβλητή και πώς να ελέγχουμε την ταχυδρομική διεύθυνση για ορθότητα
Το blog μου
$a = " Το blog μου";
preg_match("/ /", $a);
Στην κανονική μας έκφραση περιγράψαμε όλους τους πιθανούς χαρακτήρες που μπορούν να συμπεριληφθούν σε έναν σύνδεσμο. Θέλω επίσης να δώσω προσοχή στο απόσπασμα και τους χαρακτήρες "/" στην έκφρασή μας. Το γεγονός είναι ότι το "/" και το απόσπασμα είναι από μόνα τους ειδικοί χαρακτήρες. Και για να τα αντιληφθεί το πρότυπο ως συνηθισμένα σύμβολα, πρέπει να τα εξετάσουμε. Το Escape γίνεται προσθέτοντας μια ανάστροφη κάθετο πριν από ειδικούς χαρακτήρες. Ελπίζω να είναι ξεκάθαρο
$a = " Το blog μου";
preg_match("/ /", $a, $b);
Λοιπόν, κατά συνέπεια, είναι απαραίτητο να προσθέσετε μια πρόσθετη παράμετρο με τη μορφή της μεταβλητής $b, στην οποία θα αποθηκευτεί ο σύνδεσμος που βρέθηκε. Πρέπει επίσης να γνωρίζετε ότι το αποτέλεσμα αναζήτησης τοποθετείται σε έναν πίνακα. Επομένως, η μεταβλητή $b είναι ένας πίνακας. Οι πληροφορίες που αναζητούμε βρίσκονται κάτω από το ευρετήριο 1. Αυτό σημαίνει ότι το αποτέλεσμα αναζήτησης βρίσκεται στη μεταβλητή $b. Ας εμφανίσουμε το αποτέλεσμα στην οθόνη:
$a = " Το blog μου";
preg_match("/ /", $a, $b);
ηχώ $b;
Και τέλος, η απάντηση στην ερώτηση, είναι σωστό το e-mail; Αρχικά, πρέπει να μάθετε ποιοι χαρακτήρες επιτρέπονται στις διευθύνσεις; Από όσο γνωρίζω, οι επιτρεπόμενοι χαρακτήρες περιλαμβάνουν:
Άρα η τυπική έκφραση θα είναι η εξής:
$a = " [email προστατευμένο]";
if(preg_match("/^+@+.+$/", $a)) echo "η διεύθυνση ηλεκτρονικού ταχυδρομείου είναι σωστή!";
αλλιώς echo "η διεύθυνση ηλεκτρονικού ταχυδρομείου ΔΕΝ είναι γραμμένη σωστά!";
Λοιπόν... Ελπίζω να μην σε τρομάζουν τώρα τέτοιοι δίσκοι και να τους καταλαβαίνεις αρκετά.
Τέλος, θέλω να πω κάτι. Το άρθρο αποδείχθηκε δυσκίνητο και ταυτόχρονα κάλυψε μόνο ένα μέρος των πιθανοτήτων. Αν διαβάζετε αυτήν την πρόταση, τότε πιθανότατα την έχετε διαβάσει μέχρι το τέλος, για την οποία σας ευχαριστώ πολύ
Σχετικά με τη σειρά άρθρων για την ανάπτυξη ενός ιστολογίου cms, το πρώτο μέρος της σειράς Το δηλώνω κλειστό!Στο εγγύς μέλλον θα αρχίσουμε να υλοποιούμε τον πίνακα διαχείρισης, επομένως μην κάνετε "εναλλαγή" Εάν έχετε ερωτήσεις, θα χαρώ να απαντήσω. Ό,τι καλύτερο για σένα, μόνο αυτό έχω!
Οι κανονικές εκφράσεις είναι ειδικά μοτίβα για την αναζήτηση υποσυμβολοσειρών στο κείμενο. Με τη βοήθειά τους, μπορείτε να λύσετε τα ακόλουθα προβλήματα σε μία γραμμή: "ελέγξτε εάν μια συμβολοσειρά περιέχει αριθμούς", "βρείτε όλες τις διευθύνσεις email στο κείμενο", "αντικαταστήστε πολλά διαδοχικά ερωτηματικά με ένα".
Ας ξεκινήσουμε με μια δημοφιλή σοφία προγραμματισμού:
Μερικοί άνθρωποι, όταν αντιμετωπίζουν ένα πρόβλημα, σκέφτονται: «Ναι, είμαι έξυπνος, θα το λύσω χρησιμοποιώντας κανονικές εκφράσεις». Τώρα έχουν δύο προβλήματα.
Ας ξεκινήσουμε με μερικά απλά παραδείγματα. Η πρώτη έκφραση στην παρακάτω εικόνα αναζητά μια ακολουθία 3 γραμμάτων, όπου το πρώτο γράμμα είναι "k", το δεύτερο είναι οποιοδήποτε ρωσικό γράμμα και το τρίτο είναι "t" χωρίς ευαισθησία στα πεζά (για παράδειγμα, "cat" ή "KOT ” ταιριάζει σε αυτό το μοτίβο). Η δεύτερη έκφραση αναζητά το κείμενο για την ώρα με τη μορφή 12:34.
Οποιαδήποτε έκφραση ξεκινά με έναν χαρακτήρα οριοθέτη. Το σύμβολο / χρησιμοποιείται συνήθως ως αυτό, αλλά μπορείτε επίσης να χρησιμοποιήσετε άλλα σύμβολα που δεν έχουν ειδικό σκοπό σε κανονικές εκφράσεις, για παράδειγμα, ~, # ή @. Εναλλακτικοί οριοθέτες χρησιμοποιούνται εάν ο χαρακτήρας / μπορεί να εμφανίζεται στην έκφραση. Στη συνέχεια ακολουθεί το μοτίβο της συμβολοσειράς που αναζητούμε, ακολουθούμενο από ένα δεύτερο οριοθέτη και στο τέλος μπορεί να υπάρχουν ένα ή περισσότερα γράμματα σημαίας. Καθορίζουν πρόσθετες επιλογές κατά την αναζήτηση κειμένου. Ακολουθούν παραδείγματα σημαιών:
Το ίδιο το πρότυπο αποτελείται από συνηθισμένους χαρακτήρες και ειδικές κατασκευές. Λοιπόν, για παράδειγμα, το γράμμα "k" σε κανονικές εκφράσεις σημαίνει τον εαυτό του, αλλά τα σύμβολα σημαίνουν "οποιοσδήποτε αριθμός από το 0 έως το 5 μπορεί να βρίσκεται σε αυτό το μέρος." Ακολουθεί μια πλήρης λίστα ειδικών χαρακτήρων (στο εγχειρίδιο PHP ονομάζονται μεταχαρακτήρες) και όλοι οι άλλοι χαρακτήρες στην κανονική ακολουθία είναι συνηθισμένοι:
Παρακάτω θα αναλύσουμε το νόημα καθενός από αυτούς τους χαρακτήρες (και επίσης θα εξηγήσουμε γιατί το γράμμα "ε" τοποθετείται χωριστά στην πρώτη έκφραση), αλλά προς το παρόν ας προσπαθήσουμε να εφαρμόσουμε τις κανονικές εκφράσεις μας στο κείμενο και να δούμε τι συμβαίνει. Η PHP έχει μια ειδική συνάρτηση preg_match ($regexp, $text, $match) που λαμβάνει ως είσοδο κανονική έκφραση, κείμενο και έναν κενό πίνακα. Ελέγχει εάν το κείμενο περιέχει μια υποσυμβολοσειρά που ταιριάζει με το δεδομένο μοτίβο και επιστρέφει 0 εάν όχι ή 1 εάν υπάρχει. Και στον πίνακα που πέρασε, η πρώτη που βρέθηκε αντιστοιχία με την κανονική ακολουθία τοποθετείται στο στοιχείο με δείκτη 0. Ας γράψουμε ένα απλό πρόγραμμα που εφαρμόζει κανονικές εκφράσεις σε διαφορετικές συμβολοσειρές:
Αφού δούμε το παράδειγμα, ας μελετήσουμε τις κανονικές εκφράσεις με περισσότερες λεπτομέρειες.
Ας δούμε τι σημαίνουν οι διαφορετικοί τύποι αγκύλων:
Σημείωση: μπορείτε να καθορίσετε εύρη χαρακτήρων σε αγκύλες, αλλά να θυμάστε ότι το ρωσικό γράμμα е είναι ξεχωριστό από το αλφάβητο και για να γράψετε «οποιοδήποτε ρωσικό γράμμα» πρέπει να γράψετε [а-яе].
Αν έχετε κοιτάξει άλλα σεμινάρια για κανονικές εκφράσεις, πιθανότατα έχετε παρατηρήσει ότι η ανάστροφη κάθετο γράφεται διαφορετικά παντού. Κάπου γράφουν μια ανάστροφη κάθετο: \d , αλλά εδώ στα παραδείγματα επαναλαμβάνεται 2 φορές: \\d .
Η γλώσσα της κανονικής έκφρασης απαιτεί να γράψετε ανάστροφη κάθετο μία φορά. Ωστόσο, σε συμβολοσειρές σε μονά και διπλά εισαγωγικά στην PHP, η ανάστροφη κάθετο έχει επίσης μια ειδική σημασία: εγχειρίδιο για τις συμβολοσειρές.
Λοιπόν, για παράδειγμα, εάν γράψετε $x = "\$"; τότε η PHP θα το αντιμετωπίσει ως έναν ειδικό συνδυασμό και θα εισαγάγει μόνο τον χαρακτήρα $ στη συμβολοσειρά (και η μηχανή κανονικής έκφρασης δεν θα γνωρίζει για την ανάστροφη κάθετο πριν από αυτήν). Για να εισαγάγουμε την ακολουθία \$ σε μια συμβολοσειρά, πρέπει να διπλασιάσουμε την ανάστροφη κάθετο και να γράψουμε τον κώδικα ως $x = "\\$"; .
Για να γράψετε μια ανάστροφη κάθετο και έναν αριθμό (\1) σε κανονική μορφή, πρέπει να διπλασιάσετε την ανάστροφη κάθετο: "\\1"
Το \w αντιστοιχεί σε οποιοδήποτε γράμμα (οποιουδήποτε αλφαβήτου), αριθμό ή υπογράμμιση _ . Το \W ταιριάζει με οποιονδήποτε χαρακτήρα εκτός από γράμμα, αριθμό ή κάτω παύλα.
Όταν εργάζονται με κείμενα σε οποιαδήποτε σύγχρονη γλώσσα προγραμματισμού, οι προγραμματιστές αντιμετωπίζουν συνεχώς τα καθήκοντα ελέγχου των καταχωρισμένων δεδομένων για συμμόρφωση με το επιθυμητό μοτίβο, αναζήτησης και αντικατάστασης δοκιμαστικών τμημάτων και άλλων τυπικών λειτουργιών για την επεξεργασία συμβολικών πληροφοριών. Η ανάπτυξη των δικών σας αλγορίθμων επαλήθευσης οδηγεί σε απώλεια χρόνου, ασυμβατότητα του κώδικα προγράμματος και πολυπλοκότητα στην ανάπτυξη και τον εκσυγχρονισμό του.
Η ταχεία ανάπτυξη του Διαδικτύου και των γλωσσών ανάπτυξης WEB απαιτούσε τη δημιουργία καθολικών και συμπαγών εργαλείων για την επεξεργασία πληροφοριών κειμένου με την ελάχιστη ποσότητα κώδικα που απαιτείται για αυτό. Η γλώσσα PHP, δημοφιλής στους αρχάριους και επαγγελματίες προγραμματιστές, δεν αποτελεί εξαίρεση. Η κανονική έκφραση ως γλώσσα προτύπου κειμένου σάς επιτρέπει να απλοποιήσετε τις εργασίες επεξεργασίας κειμένου και να μειώσετε τον κώδικα του προγράμματος κατά δεκάδες και εκατοντάδες γραμμές. Πολλά προβλήματα δεν μπορούν να λυθούν χωρίς αυτό.
Η γλώσσα PHP περιέχει τρεις μηχανισμούς για εργασία με κανονικές εκφράσεις - "ereg", "mb_ereg" και "preg". Η πιο κοινή είναι η διεπαφή "preg", της οποίας οι λειτουργίες παρέχουν πρόσβαση στη βιβλιοθήκη κανονικών εκφράσεων PCRE, που αναπτύχθηκε αρχικά για τη γλώσσα Perl, η οποία περιλαμβάνεται στην PHP. Οι συναρτήσεις Preg αναζητούν μια δεδομένη συμβολοσειρά κειμένου για αντιστοιχίσεις σύμφωνα με ένα συγκεκριμένο μοτίβο σε γλώσσα κανονικής έκφρασης.
Είναι αδύνατο να περιγραφεί λεπτομερώς ολόκληρη η σύνταξη των κανονικών εκφράσεων σε ένα σύντομο άρθρο υπάρχει ειδική βιβλιογραφία για αυτό. Παρουσιάζουμε μόνο τα κύρια στοιχεία για να δείξουμε τις μεγάλες δυνατότητες για τον προγραμματιστή και να κατανοήσουμε τα παραδείγματα κώδικα.
Το Β ορίζεται επίσημα με πολύ περίπλοκο τρόπο, οπότε ας απλοποιήσουμε την περιγραφή. Μια κανονική έκφραση είναι μια συμβολοσειρά κειμένου. Αποτελείται από ένα μοτίβο που επισημαίνεται από έναν οριοθέτη και έναν τροποποιητή που υποδεικνύει τον τρόπο επεξεργασίας του. Είναι δυνατό να συμπεριληφθούν διάφορες εναλλακτικές και επαναλήψεις στα πρότυπα.
Για παράδειγμα, στην έκφραση /\d(3)-\d(2)-\d(2)/mο διαχωριστής θα είναι «/» , μετά έρχεται το μοτίβο και το σύμβολο "μ"θα είναι ένας τροποποιητής.
Όλη η δύναμη των κανονικών εκφράσεων κωδικοποιείται χρησιμοποιώντας μεταχαρακτήρες. Ο κύριος μεταχαρακτήρας της γλώσσας είναι η ανάστροφη κάθετο - "\". Αντιστρέφει τον τύπο του χαρακτήρα που τον ακολουθεί (δηλαδή, ένας κανονικός χαρακτήρας γίνεται μεταχαρακτήρας και το αντίστροφο). Ένας άλλος σημαντικός μεταχαρακτήρας είναι η κάθετο "|", η οποία καθορίζει εναλλακτικές παραλλαγές του μοτίβου. Περισσότερα παραδείγματα μεταχαρακτήρες:
Η PHP, όταν επεξεργάζεται κανονικές εκφράσεις, αντιμετωπίζει το χώρο ως ξεχωριστό σημαντικό χαρακτήρα, επομένως οι εκφράσεις ABCWHERE και ABCWHERE είναι διαφορετικές.
Στην PHP, τα κανονικά υπομοτίβα χωρίζονται με παρενθέσεις και μερικές φορές ονομάζονται "υποεκφράσεις". Εκτελέστε τις ακόλουθες λειτουργίες:
Επισήμανση εναλλακτικών. Για παράδειγμα, πρότυπο ζέστη(κάτι|πουλί|)ταιριάζει με τις λέξεις "θερμότητα", "firebird"Και "ψητό". Και χωρίς τις παρενθέσεις θα ήταν απλώς μια άδεια χορδή, «πουλί» και «ψητό».
«Συναρπαστικό» υπο-μοτίβο.Αυτό σημαίνει ότι εάν μια υποσυμβολοσειρά ταιριάζει στο μοτίβο, τότε όλες οι αντιστοιχίσεις επιστρέφονται ως αποτέλεσμα. Για λόγους σαφήνειας, ας δώσουμε ένα παράδειγμα. Δίνεται η ακόλουθη κανονική έκφραση: ο νικητής λαμβάνει((χρυσό|χρυσό)(μετάλλιο|κύπελλο)) -και μια γραμμή για εύρεση αντιστοιχιών: "ο νικητής παίρνει ένα χρυσό μετάλλιο". Εκτός από την αρχική φράση, το αποτέλεσμα αναζήτησης θα επιστρέψει: "χρυσό μετάλλιο", "μετάλλιο", "χρυσό".
Όταν γράφετε κανονικές εκφράσεις, είναι συχνά απαραίτητο να αναλύετε επαναλήψεις αριθμών και συμβόλων. Αυτό δεν είναι πρόβλημα εάν δεν υπάρχουν πολλές επαναλήψεις. Τι να κάνουμε όμως όταν δεν γνωρίζουμε τον ακριβή αριθμό τους; Σε αυτή την περίπτωση, πρέπει να χρησιμοποιήσετε ειδικούς μεταχαρακτήρες.
Για την περιγραφή των επαναλήψεων, χρησιμοποιούνται τετραγωνιστές - μετασύμβολα για τον προσδιορισμό της ποσότητας. Οι τετραγωνιστές είναι δύο τύπων:
Ο γενικός ποσοτικός προσδιορίζει τον ελάχιστο και μέγιστο αριθμό επιτρεπόμενων επαναλήψεων ενός στοιχείου, εκφραζόμενοι ως δύο αριθμοί σε σγουρά άγκιστρα, όπως αυτό: x(2,5). Εάν ο μέγιστος αριθμός επαναλήψεων είναι άγνωστος, το δεύτερο όρισμα παραλείπεται: x(2,).
Οι συντομογραφικοί ποσοτικοί δείκτες αντιπροσωπεύουν σύμβολα για τις πιο συνηθισμένες επαναλήψεις για να αποφευχθεί η περιττή συντακτική ακαταστασία. Συνήθως χρησιμοποιούνται τρεις συντομογραφίες:
1. * - μηδέν ή περισσότερες επαναλήψεις, που ισοδυναμεί με (0,).
2. + - μία ή περισσότερες επαναλήψεις, δηλ. ,).
3. ? - μηδέν ή μόνο μία επανάληψη - (0,1).
Για όσους μαθαίνουν κανονικές εκφράσεις, τα παραδείγματα είναι το καλύτερο σεμινάριο. Θα παρουσιάσουμε μερικά που δείχνουν τις ευρείες δυνατότητές τους με ελάχιστη προσπάθεια. Όλοι οι κωδικοί προγράμματος είναι πλήρως συμβατοί με τις εκδόσεις PHP 4.x και νεότερες. Για την πλήρη κατανόηση της σύνταξης και τη χρήση όλων των χαρακτηριστικών της γλώσσας, προτείνουμε το βιβλίο του J. Friedl “Regular Expressions”, το οποίο εξετάζει πλήρως τη σύνταξη και περιέχει παραδείγματα κανονικών εκφράσεων όχι μόνο στην PHP, αλλά και για Python, Perl, MySQL, Java, Ruby και C#.
Εργο.Υπάρχει μια σελίδα στο Διαδίκτυο που ζητά από τον επισκέπτη μια διεύθυνση email. Η τυπική έκφραση πρέπει να ελέγχει ότι η ληφθείσα διεύθυνση είναι σωστή πριν στείλει μηνύματα. Ο έλεγχος δεν εγγυάται ότι το καθορισμένο γραμματοκιβώτιο υπάρχει πράγματι και δέχεται γράμματα. Αλλά μπορεί να εξαλείψει προφανώς λανθασμένες διευθύνσεις.
Διάλυμα.Όπως συμβαίνει με οποιαδήποτε γλώσσα προγραμματισμού, οι τυπικές εκφράσεις επαλήθευσης διεύθυνσης email μπορούν να εφαρμοστούν στην PHP με διάφορους τρόπους και τα παραδείγματα σε αυτό το άρθρο δεν είναι το καλύτερο και το τέλος. Επομένως, σε κάθε περίπτωση θα παρέχουμε μια λίστα απαιτήσεων που πρέπει να λαμβάνονται υπόψη κατά τον προγραμματισμό και η συγκεκριμένη υλοποίηση εξαρτάται αποκλειστικά από τον προγραμματιστή.
Επομένως, μια έκφραση που ελέγχει αν ένα email είναι έγκυρο πρέπει να ελέγχει τις ακόλουθες συνθήκες:
Ένα παράδειγμα που λαμβάνει υπόψη όλες αυτές τις συνθήκες φαίνεται παρακάτω στο σχήμα.
Εργο.Ελέγξτε εάν μια δεδομένη συμβολοσειρά κειμένου είναι έγκυρη Για άλλη μια φορά, οι τυπικές εκφράσεις ελέγχου διεύθυνσης URL μπορούν να εφαρμοστούν με διάφορους τρόπους.
Διάλυμα.Η τελική μας έκδοση μοιάζει με αυτό:
/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /
Τώρα ας δούμε τα συστατικά του με περισσότερες λεπτομέρειες χρησιμοποιώντας το σχήμα.
Εργο.Είναι απαραίτητο να ελέγξετε την ορθότητα του εισαγόμενου αριθμού πλαστικής κάρτας για τα πιο κοινά συστήματα πληρωμών. Η επιλογή εξετάζεται μόνο για κάρτες
Διάλυμα.Κατά τη δημιουργία μιας έκφρασης, πρέπει να λάβετε υπόψη την πιθανή παρουσία διαστημάτων στον εισαγόμενο αριθμό. Οι αριθμοί στην κάρτα χωρίζονται σε ομάδες για να διευκολύνουν την ανάγνωση και την υπαγόρευση. Επομένως, είναι πολύ φυσικό ένα άτομο να προσπαθήσει να εισαγάγει τον αριθμό με αυτόν τον τρόπο (δηλαδή χρησιμοποιώντας κενά).
Η σύνταξη μιας καθολικής έκφρασης που λαμβάνει υπόψη πιθανά κενά και παύλες είναι πιο δύσκολη από την απλή απόρριψη όλων των χαρακτήρων εκτός από τους αριθμούς. Επομένως, συνιστάται η χρήση του μεταχαρακτήρα /D στην έκφραση, ο οποίος αφαιρεί όλους τους χαρακτήρες εκτός από τους αριθμούς.
Τώρα μπορείτε να προχωρήσετε απευθείας στον έλεγχο του αριθμού. Όλες οι εταιρείες πιστωτικών καρτών χρησιμοποιούν μια μοναδική μορφή αριθμού. Στο παράδειγμα αυτό χρησιμοποιείται και ο πελάτης δεν χρειάζεται να εισαγάγει το όνομα της εταιρείας - καθορίζεται από τον αριθμό. Οι κάρτες Visa ξεκινούν πάντα με 4 και έχουν μήκος αριθμού 13 ή 16 ψηφίων. Η MasterCard ξεκινά στην περιοχή 51-55 με μήκος αριθμού 16. Ως αποτέλεσμα, έχουμε την ακόλουθη έκφραση:
Πριν από την επεξεργασία μιας παραγγελίας, μπορείτε να πραγματοποιήσετε έναν επιπλέον έλεγχο του τελευταίου ψηφίου του αριθμού, ο οποίος υπολογίζεται χρησιμοποιώντας τον αλγόριθμο Luhn.
Εργο.Έλεγχος της ορθότητας του εισαγόμενου αριθμού τηλεφώνου.
Διάλυμα.Ο αριθμός των ψηφίων στους αριθμούς σταθερού και κινητού τηλεφώνου ποικίλλει σημαντικά από χώρα σε χώρα, επομένως δεν είναι δυνατός ο καθολικός έλεγχος εάν ένας αριθμός τηλεφώνου είναι σωστός χρησιμοποιώντας κανονικές εκφράσεις. Αλλά οι διεθνείς αριθμοί έχουν αυστηρή μορφή και είναι ιδανικοί για έλεγχο προτύπων. Επιπλέον, όλο και περισσότεροι εθνικοί τηλεφωνικοί φορείς προσπαθούν να συμμορφωθούν με ένα ενιαίο πρότυπο. Η δομή του αριθμού έχει ως εξής:
+CCC.NNNNNNNNNNxEEEE,Οπου:
C είναι ο κωδικός χώρας, που αποτελείται από 1-3 ψηφία.
N - αριθμός έως 14 ψηφία.
E - προαιρετική επέκταση.
Το συν είναι απαραίτητο στοιχείο και το σύμβολο x υπάρχει μόνο όταν είναι απαραίτητη η επέκταση.
Ως αποτέλεσμα, έχουμε την ακόλουθη έκφραση:
^\+(1,3)\.(4,14)(?:x.+)?$
Εργο.Πρέπει να ταιριάξετε έναν ακέραιο εντός ενός συγκεκριμένου εύρους. Επιπλέον, είναι απαραίτητο οι κανονικές εκφράσεις να ταιριάζουν μόνο με αριθμούς από μια περιοχή τιμών.
Διάλυμα. Ακολουθούν ορισμένες εκφράσεις για μερικές από τις πιο συνηθισμένες περιπτώσεις:
Εργο.Πρέπει να καθορίσετε εάν η δεδομένη συμβολοσειρά είναι μια έγκυρη διεύθυνση IP σε μορφή IPv4 στην περιοχή 000.000.000.000-255.255.255.255.
Διάλυμα.Όπως με κάθε εργασία στην PHP, οι τυπικές εκφράσεις έχουν πολλές παραλλαγές. Για παράδειγμα, αυτό:
Ο έλεγχος της ορθότητας των κανονικών εκφράσεων μπορεί να είναι δύσκολος για τους νέους προγραμματιστές λόγω της πολυπλοκότητας της σύνταξης, η οποία διαφέρει από τις «κανονικές» γλώσσες προγραμματισμού. Για την επίλυση αυτού του προβλήματος, υπάρχουν πολλοί διαδικτυακοί ελεγκτές εκφράσεων που διευκολύνουν τον έλεγχο της ορθότητας του προτύπου που δημιουργήθηκε σε πραγματικό κείμενο. Ο προγραμματιστής εισάγει την έκφραση και τα δεδομένα προς δοκιμή και βλέπει αμέσως το αποτέλεσμα της επεξεργασίας. Συνήθως υπάρχει επίσης μια ενότητα αναφοράς όπου περιγράφονται λεπτομερώς κανονικές εκφράσεις, παραδείγματα και διαφορές υλοποίησης για τις πιο κοινές γλώσσες προγραμματισμού.
Αλλά η απόλυτη εμπιστοσύνη στα αποτελέσματα των διαδικτυακών υπηρεσιών δεν συνιστάται για όλους τους προγραμματιστές που χρησιμοποιούν PHP. Μια κανονική έκφραση, γραπτή και δοκιμασμένη προσωπικά, βελτιώνει τις δεξιότητές σας και εγγυάται την απουσία σφαλμάτων.
Η πιο κοινή χρήση κανονικών εκφράσεων στο Perl είναι στην αναζήτηση και αντικατάσταση τελεστών όπως π.χ μικρό//, m/, τελεστές σύνδεσης =~ ή != και τα λοιπά. Κατά κανόνα, όλοι αυτοί οι χειριστές έχουν παρόμοιες επιλογές όπως:
Συνήθως όλες αυτές οι επιλογές σημειώνονται ως "/x". Μπορούν να χρησιμοποιηθούν ακόμη και μέσα σε πρότυπα χρησιμοποιώντας τη νέα κατασκευή (?...)
Οι τυπικές εκφράσεις ή μοτίβα είναι ίδιες με τις διαδικασίες regexp στο Unix. Οι εκφράσεις και η σύνταξη δανείζονται από τις ελεύθερα διανεμημένες διαδικασίες V8 του Henry Spencer, όπου περιγράφονται λεπτομερώς.
Τα πρότυπα χρησιμοποιούν τους ακόλουθους μεταχαρακτήρες (χαρακτήρες που υποδηλώνουν ομάδες άλλων χαρακτήρων) που συχνά ονομάζονται πρότυπο egrep:
Οι μεταχαρακτήρες έχουν τροποποιητές (γραμμένοι μετά τον μεταχαρακτήρα):
Σε όλες τις άλλες περιπτώσεις, τα σγουρά σιδεράκια θεωρούνται συνηθισμένοι (κανονικοί) χαρακτήρες. Έτσι το "*" είναι ισοδύναμο με (0,) , το "+" είναι (1,) και "?" - (0,1). Τα n και m δεν μπορούν να είναι μεγαλύτερα από 65536.
Από προεπιλογή, οι μεταχαρακτήρες είναι άπληστοι. Ο αγώνας διαδίδεται όσο το δυνατόν περισσότερες φορές, χωρίς να λαμβάνεται υπόψη η επίδραση των επόμενων μεταχαρακτόρων. Εάν θέλετε να τους "μειώσετε την όρεξη", χρησιμοποιήστε το σύμβολο "?" Αυτό δεν αλλάζει την έννοια των μεταχαρακτήρων, απλώς μειώνει τη διάδοση. Ετσι:
Οι χαρακτήρες μπαλαντέρ λειτουργούν με τον ίδιο τρόπο όπως τα διπλά εισαγωγικά, ώστε να μπορείτε να χρησιμοποιήσετε χαρακτήρες `\` (πίσω κάθετο) σε αυτά:
\ t | - χαρακτήρας καρτέλας |
\n | - νέα γραμμή |
\r | - μεταφορά με άμαξα |
\ΕΝΑ | - μετάφραση μορφής |
\v | - κατακόρυφος πίνακας |
\ένα | - κλήση |
\μι | - απόδραση |
\033 | - οκταδική σημείωση συμβόλων |
\x1A | - δεκαεξαδικό |
\ντο[ | - σύμβολο ελέγχου |
\μεγάλο | - πεζά τον επόμενο χαρακτήρα |
\u | - κεφαλαία -//- |
\ΜΕΓΑΛΟ | - όλοι οι χαρακτήρες είναι πεζοί μέχρι \E |
\U | - στο επάνω μέρος -//- |
\ΜΙ | - εγγραφή περιοριστή αλλαγής |
\Q | - ακύρωση δράσης ως μεταχαρακτήρα |
Επιπλέον, οι ακόλουθοι μεταχαρακτήρες έχουν προστεθεί στο Perl:
Σημειώστε ότι όλα αυτά είναι "ένας" χαρακτήρας. Χρησιμοποιήστε τροποποιητές για να υποδείξετε τη σειρά. Ετσι:
Επιπλέον, υπάρχουν φανταστικοί μεταχαρακτήρες. Δηλώνει ανύπαρκτα σύμβολα στο σημείο που αλλάζει η τιμή. Οπως:
Ένα όριο λέξης (\b) είναι ένα φανταστικό σημείο μεταξύ των χαρακτήρων \w και \W. Μέσα σε μια κλάση χαρακτήρων, το "\b" αντιπροσωπεύει τον χαρακτήρα backspace. Μεταχαρακτήρες \ΕΝΑΚαι \Z- είναι παρόμοια με τα "^" και "$", αλλά αν η αρχή της γραμμής "^" και το τέλος της γραμμής "$" ενεργούν για κάθε γραμμή σε μια συμβολοσειρά πολλών γραμμών, τότε \ΕΝΑΚαι \Zυποδεικνύουν την αρχή και το τέλος μιας ολόκληρης συμβολοσειράς πολλών γραμμών.
Εάν χρησιμοποιείται ομαδοποίηση (παρενθέσεις) μέσα στο μοτίβο, τότε ο αριθμός υποσυμβολοσειράς της ομάδας ορίζεται ως "\digit". Σημειώστε ότι ακολουθώντας ένα μοτίβο μέσα σε μια έκφραση ή μπλοκ, αυτές οι ομάδες συμβολίζονται ως "$digit". Επιπλέον, υπάρχουν πρόσθετες μεταβλητές:
Παράδειγμα:
$s = "Ένα 1 δύο 2 και τρία 3";
if ($s =~ /(\d+)\D+(\d+)/) ( εκτύπωση "$1\n"; # Αποτέλεσμα "1" εκτύπωση "$2\n"; # "2" εκτύπωση "$+\n" ; # "2" print "$&\n" # "1 two 2" print "$"\n";
Παράδειγμα:
Η έκδοση 5 της Perl περιέχει πρόσθετες δομές προτύπων:
$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Βρείτε τον αριθμό που ακολουθείται από "-" ( εκτύπωση "$1\n"; # Αποτέλεσμα "2" ) else ( εκτύπωση "σφάλμα αναζήτησης\n" )
Παράδειγμα:
(?! μοτίβο) - «κοιτάζοντας» μπροστά με άρνηση:
$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Βρείτε ένα ψηφίο που δεν ακολουθείται από "+" ( εκτύπωση "$1\n"; # Αποτέλεσμα "2" ) else ( εκτύπωση "αναζήτηση σφάλμα\ n";)
(?ismx) - «εσωτερικοί» τροποποιητές. Είναι βολικό για χρήση σε πρότυπα, όπου, για παράδειγμα, πρέπει να καθορίσετε έναν τροποποιητή μέσα στο πρότυπο.