PHP (κανονική έκφραση) - τι είναι; Παραδείγματα και έλεγχος κανονικών εκφράσεων. Κανονικές εκφράσεις (μοτίβα)

Παιδικά προϊόντα 13.08.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Ας ξεκινήσουμε με το τι είναι η κανονική έκφραση. Απαντήστε μου λοιπόν σε αυτή την ερώτηση: υπάρχει «ε» στη λέξη «δοκιμή»; "Φάω!" λες. Στη συνέχεια σας κάνω μια δεύτερη ερώτηση, πώς βρήκατε το γράμμα "ε" στη λέξη "τεστ"; Η απάντηση είναι προφανής, παίρνουμε τον πρώτο χαρακτήρα, δηλαδή το “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.

Οποιαδήποτε έκφραση ξεκινά με έναν χαρακτήρα οριοθέτη. Το σύμβολο / χρησιμοποιείται συνήθως ως αυτό, αλλά μπορείτε επίσης να χρησιμοποιήσετε άλλα σύμβολα που δεν έχουν ειδικό σκοπό σε κανονικές εκφράσεις, για παράδειγμα, ~, # ή @. Εναλλακτικοί οριοθέτες χρησιμοποιούνται εάν ο χαρακτήρας / μπορεί να εμφανίζεται στην έκφραση. Στη συνέχεια ακολουθεί το μοτίβο της συμβολοσειράς που αναζητούμε, ακολουθούμενο από ένα δεύτερο οριοθέτη και στο τέλος μπορεί να υπάρχουν ένα ή περισσότερα γράμματα σημαίας. Καθορίζουν πρόσθετες επιλογές κατά την αναζήτηση κειμένου. Ακολουθούν παραδείγματα σημαιών:

  • i - λέει ότι η αναζήτηση θα πρέπει να είναι χωρίς διάκριση πεζών-κεφαλαίων (με διάκριση πεζών-κεφαλαίων από προεπιλογή)
  • Το u - λέει ότι η έκφραση και το κείμενο που αναζητείται χρησιμοποιούν την κωδικοποίηση utf-8 και όχι μόνο λατινικά γράμματα. Χωρίς αυτό, η αναζήτηση για ρωσικούς (και οποιουσδήποτε άλλους μη λατινικούς) χαρακτήρες ενδέχεται να μην λειτουργεί σωστά, επομένως θα πρέπει πάντα να τη ρυθμίζετε.

Το ίδιο το πρότυπο αποτελείται από συνηθισμένους χαρακτήρες και ειδικές κατασκευές. Λοιπόν, για παράδειγμα, το γράμμα "k" σε κανονικές εκφράσεις σημαίνει τον εαυτό του, αλλά τα σύμβολα σημαίνουν "οποιοσδήποτε αριθμός από το 0 έως το 5 μπορεί να βρίσκεται σε αυτό το μέρος." Ακολουθεί μια πλήρης λίστα ειδικών χαρακτήρων (στο εγχειρίδιο PHP ονομάζονται μεταχαρακτήρες) και όλοι οι άλλοι χαρακτήρες στην κανονική ακολουθία είναι συνηθισμένοι:

Παρακάτω θα αναλύσουμε το νόημα καθενός από αυτούς τους χαρακτήρες (και επίσης θα εξηγήσουμε γιατί το γράμμα "ε" τοποθετείται χωριστά στην πρώτη έκφραση), αλλά προς το παρόν ας προσπαθήσουμε να εφαρμόσουμε τις κανονικές εκφράσεις μας στο κείμενο και να δούμε τι συμβαίνει. Η PHP έχει μια ειδική συνάρτηση preg_match ($regexp, $text, $match) που λαμβάνει ως είσοδο κανονική έκφραση, κείμενο και έναν κενό πίνακα. Ελέγχει εάν το κείμενο περιέχει μια υποσυμβολοσειρά που ταιριάζει με το δεδομένο μοτίβο και επιστρέφει 0 εάν όχι ή 1 εάν υπάρχει. Και στον πίνακα που πέρασε, η πρώτη που βρέθηκε αντιστοιχία με την κανονική ακολουθία τοποθετείται στο στοιχείο με δείκτη 0. Ας γράψουμε ένα απλό πρόγραμμα που εφαρμόζει κανονικές εκφράσεις σε διαφορετικές συμβολοσειρές:

Αφού δούμε το παράδειγμα, ας μελετήσουμε τις κανονικές εκφράσεις με περισσότερες λεπτομέρειες.

Παρενθέσεις σε κανονικές εκφράσεις

Ας δούμε τι σημαίνουν οι διαφορετικοί τύποι αγκύλων:

  • Οι σγουρές αγκύλες a(1,5) καθορίζουν τον αριθμό των επαναλήψεων του προηγούμενου χαρακτήρα - σε αυτό το παράδειγμα, η έκφραση αναζητά 1 έως 5 διαδοχικά γράμματα "a"
  • Οι αγκύλες σημαίνουν "οποιονδήποτε από αυτούς τους χαρακτήρες", σε αυτήν την περίπτωση τα γράμματα a, b, c, x, y, z ή έναν αριθμό από το 0 έως το 5. Άλλοι ειδικοί χαρακτήρες όπως | ή * - δηλώνουν έναν κανονικό χαρακτήρα. Εάν υπάρχει ένα σύμβολο ^ στην αρχή των αγκύλων, τότε η σημασία αλλάζει στο αντίθετο: "οποιοσδήποτε χαρακτήρας εκτός από αυτούς που υποδεικνύονται" - για παράδειγμα [^a-c] σημαίνει "οποιοσδήποτε χαρακτήρας εκτός από a, b ή c".
  • Παρενθέσεις ομαδοποιούν χαρακτήρες και εκφράσεις. Για παράδειγμα, στην έκφραση abc+, το σύμβολο συν αναφέρεται μόνο στο γράμμα c και αυτή η έκφραση αναζητά λέξεις όπως abc, abcc, abccc. Και αν βάλετε παρενθέσεις a(bc)+, τότε ο ποσοτικός συν αναφέρεται στην ακολουθία bc και η έκφραση αναζητά τις λέξεις abc, abcbc, abcbcbc

Σημείωση: μπορείτε να καθορίσετε εύρη χαρακτήρων σε αγκύλες, αλλά να θυμάστε ότι το ρωσικό γράμμα е είναι ξεχωριστό από το αλφάβητο και για να γράψετε «οποιοδήποτε ρωσικό γράμμα» πρέπει να γράψετε [а-яе].

Bexslashes

Αν έχετε κοιτάξει άλλα σεμινάρια για κανονικές εκφράσεις, πιθανότατα έχετε παρατηρήσει ότι η ανάστροφη κάθετο γράφεται διαφορετικά παντού. Κάπου γράφουν μια ανάστροφη κάθετο: \d , αλλά εδώ στα παραδείγματα επαναλαμβάνεται 2 φορές: \\d .

Η γλώσσα της κανονικής έκφρασης απαιτεί να γράψετε ανάστροφη κάθετο μία φορά. Ωστόσο, σε συμβολοσειρές σε μονά και διπλά εισαγωγικά στην PHP, η ανάστροφη κάθετο έχει επίσης μια ειδική σημασία: εγχειρίδιο για τις συμβολοσειρές.

Λοιπόν, για παράδειγμα, εάν γράψετε $x = "\$"; τότε η PHP θα το αντιμετωπίσει ως έναν ειδικό συνδυασμό και θα εισαγάγει μόνο τον χαρακτήρα $ στη συμβολοσειρά (και η μηχανή κανονικής έκφρασης δεν θα γνωρίζει για την ανάστροφη κάθετο πριν από αυτήν). Για να εισαγάγουμε την ακολουθία \$ σε μια συμβολοσειρά, πρέπει να διπλασιάσουμε την ανάστροφη κάθετο και να γράψουμε τον κώδικα ως $x = "\\$"; .

  • Για το λόγο αυτό, σε ορισμένες περιπτώσεις (όπου η ακολουθία των χαρακτήρων έχει ιδιαίτερη σημασία στην PHP) πρέπει να διπλασιάσουμε την ανάστροφη κάθετο:
  • Για να γράψουμε \$ σε κανονική έκφραση, γράφουμε "\\$" στον κώδικα
  • Για να γράψουμε \\ σε κανονική έκφραση, διπλασιάζουμε κάθε ανάστροφη κάθετο και γράφουμε "\\\\"

Για να γράψετε μια ανάστροφη κάθετο και έναν αριθμό (\1) σε κανονική μορφή, πρέπει να διπλασιάσετε την ανάστροφη κάθετο: "\\1"

Σε άλλες περιπτώσεις, μία ή δύο ανάστροφες κάθετες θα δώσουν το ίδιο αποτέλεσμα: "\\d" και "\d" θα εισάγουν ένα ζεύγος χαρακτήρων \d στη γραμμή - στην πρώτη περίπτωση, 2 ανάστροφες κάθετες είναι η ακολουθία για την εισαγωγή μιας ανάστροφης κάθετης , στη δεύτερη περίπτωση δεν υπάρχει ειδική σειρά και οι χαρακτήρες θα μπουν ως έχουν. Μπορείτε να ελέγξετε ποιοι χαρακτήρες θα εισαχθούν σε μια συμβολοσειρά και τι θα δει η μηχανή κανονικών εκφράσεων χρησιμοποιώντας echo: echo "\$"; . Ναι, είναι δύσκολο, αλλά τι μπορείτε να κάνετε;

  • Ιδιαίτερα σχέδια στην κανονική περίοδο
  • \d αναζητά οποιοδήποτε ψηφίο, \D - οποιονδήποτε χαρακτήρα εκτός από ένα ψηφίο

Το \w αντιστοιχεί σε οποιοδήποτε γράμμα (οποιουδήποτε αλφαβήτου), αριθμό ή υπογράμμιση _ . Το \W ταιριάζει με οποιονδήποτε χαρακτήρα εκτός από γράμμα, αριθμό ή κάτω παύλα.

Επίσης, υπάρχει μια βολική συνθήκη για την ένδειξη ενός ορίου λέξης: \b .

  • Αυτή η κατασκευή σημαίνει ότι στη μία πλευρά του θα πρέπει να υπάρχει ένας χαρακτήρας που είναι γράμμα/αριθμός/υπογράμμιση (\w), και στην άλλη πλευρά θα πρέπει να υπάρχει ένας χαρακτήρας που δεν είναι. Λοιπόν, για παράδειγμα, θέλουμε να βρούμε τη λέξη «γάτα» στο κείμενο. Εάν γράψουμε την κανονική έκφραση /cat/ui, τότε θα βρει την ακολουθία αυτών των γραμμάτων οπουδήποτε - για παράδειγμα, μέσα στη λέξη "βοοειδή". Αυτό προφανώς δεν είναι αυτό που θέλαμε. Εάν προσθέσουμε μια οριακή συνθήκη λέξης στην κανονική έκφραση: /\bcat\b/ui , τότε τώρα θα γίνει αναζήτηση μόνο της αυτόνομης λέξης "cat".

Όταν εργάζονται με κείμενα σε οποιαδήποτε σύγχρονη γλώσσα προγραμματισμού, οι προγραμματιστές αντιμετωπίζουν συνεχώς τα καθήκοντα ελέγχου των καταχωρισμένων δεδομένων για συμμόρφωση με το επιθυμητό μοτίβο, αναζήτησης και αντικατάστασης δοκιμαστικών τμημάτων και άλλων τυπικών λειτουργιών για την επεξεργασία συμβολικών πληροφοριών. Η ανάπτυξη των δικών σας αλγορίθμων επαλήθευσης οδηγεί σε απώλεια χρόνου, ασυμβατότητα του κώδικα προγράμματος και πολυπλοκότητα στην ανάπτυξη και τον εκσυγχρονισμό του.

Η ταχεία ανάπτυξη του Διαδικτύου και των γλωσσών ανάπτυξης WEB απαιτούσε τη δημιουργία καθολικών και συμπαγών εργαλείων για την επεξεργασία πληροφοριών κειμένου με την ελάχιστη ποσότητα κώδικα που απαιτείται για αυτό. Η γλώσσα PHP, δημοφιλής στους αρχάριους και επαγγελματίες προγραμματιστές, δεν αποτελεί εξαίρεση. Η κανονική έκφραση ως γλώσσα προτύπου κειμένου σάς επιτρέπει να απλοποιήσετε τις εργασίες επεξεργασίας κειμένου και να μειώσετε τον κώδικα του προγράμματος κατά δεκάδες και εκατοντάδες γραμμές. Πολλά προβλήματα δεν μπορούν να λυθούν χωρίς αυτό.

Κανονικές εκφράσεις στην 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#.

Έλεγχος της ορθότητας της διεύθυνσης e-mail

Εργο.Υπάρχει μια σελίδα στο Διαδίκτυο που ζητά από τον επισκέπτη μια διεύθυνση email. Η τυπική έκφραση πρέπει να ελέγχει ότι η ληφθείσα διεύθυνση είναι σωστή πριν στείλει μηνύματα. Ο έλεγχος δεν εγγυάται ότι το καθορισμένο γραμματοκιβώτιο υπάρχει πράγματι και δέχεται γράμματα. Αλλά μπορεί να εξαλείψει προφανώς λανθασμένες διευθύνσεις.

Διάλυμα.Όπως συμβαίνει με οποιαδήποτε γλώσσα προγραμματισμού, οι τυπικές εκφράσεις επαλήθευσης διεύθυνσης email μπορούν να εφαρμοστούν στην PHP με διάφορους τρόπους και τα παραδείγματα σε αυτό το άρθρο δεν είναι το καλύτερο και το τέλος. Επομένως, σε κάθε περίπτωση θα παρέχουμε μια λίστα απαιτήσεων που πρέπει να λαμβάνονται υπόψη κατά τον προγραμματισμό και η συγκεκριμένη υλοποίηση εξαρτάται αποκλειστικά από τον προγραμματιστή.

Επομένως, μια έκφραση που ελέγχει αν ένα email είναι έγκυρο πρέπει να ελέγχει τις ακόλουθες συνθήκες:

  1. Η παρουσία του συμβόλου @ στη συμβολοσειρά πηγής και η απουσία διαστημάτων.
  2. Το τμήμα τομέα της διεύθυνσης, ακολουθούμενο από το σύμβολο @, περιέχει μόνο έγκυρους χαρακτήρες για ονόματα τομέα. Το ίδιο ισχύει και για το όνομα χρήστη.
  3. Όταν ελέγχετε ένα όνομα χρήστη, πρέπει να αναζητήσετε ειδικούς χαρακτήρες όπως η απόστροφη ή Αυτοί οι χαρακτήρες είναι δυνητικά επικίνδυνοι και μπορούν να βρεθούν σε επιθέσεις όπως η ένεση SQL. Αποφύγετε τέτοιες διευθύνσεις.
  4. Τα ονόματα χρήστη επιτρέπουν μόνο μία τελεία, η οποία δεν μπορεί να είναι ο πρώτος ή ο τελευταίος χαρακτήρας στη γραμμή.
  5. Το όνομα τομέα πρέπει να περιέχει τουλάχιστον δύο και όχι περισσότερους από έξι χαρακτήρες.

Ένα παράδειγμα που λαμβάνει υπόψη όλες αυτές τις συνθήκες φαίνεται παρακάτω στο σχήμα.

Έλεγχος εγκυρότητας διευθύνσεων URL

Εργο.Ελέγξτε εάν μια δεδομένη συμβολοσειρά κειμένου είναι έγκυρη Για άλλη μια φορά, οι τυπικές εκφράσεις ελέγχου διεύθυνσης 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

Εργο.Πρέπει να καθορίσετε εάν η δεδομένη συμβολοσειρά είναι μια έγκυρη διεύθυνση 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) - «εσωτερικοί» τροποποιητές. Είναι βολικό για χρήση σε πρότυπα, όπου, για παράδειγμα, πρέπει να καθορίσετε έναν τροποποιητή μέσα στο πρότυπο.

  1. Κανόνες κανονικής έκφρασης. (regex)
  2. Οποιοσδήποτε χαρακτήρας αντιπροσωπεύει τον εαυτό του εκτός κι αν είναι μεταχαρακτήρας. Εάν πρέπει να ακυρώσετε το εφέ ενός μεταχαρακτήρα, βάλτε το "\" μπροστά του.
  3. Η συμβολοσειρά χαρακτήρων υποδηλώνει μια συμβολοσειρά από αυτούς τους χαρακτήρες.
  4. Το σύνολο των πιθανών χαρακτήρων (κλάση) περικλείεται σε αγκύλες "", αυτό σημαίνει ότι ένας από τους χαρακτήρες που καθορίζονται σε αγκύλες μπορεί να εμφανιστεί σε αυτό το μέρος. Εάν ο πρώτος χαρακτήρας στις αγκύλες είναι "^", τότε κανένας από τους καθορισμένους χαρακτήρες δεν μπορεί να εμφανιστεί σε αυτό το σημείο της έκφρασης. Μέσα σε μια τάξη, μπορείτε να χρησιμοποιήσετε το σύμβολο "-" για να υποδείξετε μια σειρά χαρακτήρων. Για παράδειγμα, το a-z είναι ένα από τα μικρά γράμματα του λατινικού αλφαβήτου, το 0-9 είναι ένας αριθμός κ.λπ.


Φόρουμ πύλης PHP. S.U.

Κορυφή