Όταν εργάζεστε με κείμενα σε οποιαδήποτε σύγχρονη γλώσσαΟι προγραμματιστές προγραμματισμού αντιμετωπίζουν συνεχώς τα καθήκοντα ελέγχου των δεδομένων που έχουν εισαχθεί για συμμόρφωση με το επιθυμητό μοτίβο, εύρεση και αντικατάσταση δοκιμαστικών τμημάτων και άλλων τυπικών λειτουργιών για την επεξεργασία συμβολικών πληροφοριών. Η ανάπτυξη των δικών σας αλγορίθμων επαλήθευσης οδηγεί σε απώλεια χρόνου, ασυμβατότητα του κώδικα προγράμματος και πολυπλοκότητα στην ανάπτυξη και τον εκσυγχρονισμό του.
Ταχεία ανάπτυξη του Διαδικτύου και των γλωσσών ανάπτυξης WEBζήτησε τη δημιουργία καθολικών και συμπαγών μέσων επεξεργασίας πληροφοριών κειμένου με τον ελάχιστο απαιτούμενο κώδικα για αυτό. Η γλώσσα PHP, η οποία είναι δημοφιλής στους αρχάριους και τους επαγγελματίες προγραμματιστές, δεν αποτελεί εξαίρεση. Η τακτική έκφραση ως γλώσσα προτύπου κειμένου καθιστά δυνατή την απλοποίηση των εργασιών επεξεργασίας κειμένου και τη μείωση του κώδικα προγράμματος κατά δεκάδες ή εκατοντάδες γραμμές. Πολλές εργασίες δεν μπορούν να επιλυθούν καθόλου χωρίς αυτήν.
Η γλώσσα PHP περιέχει τρεις μηχανισμούς για την εργασίαΟι τυπικές εκφράσεις είναι "ereg", "mb_ereg" και "preg". Η πιο συνηθισμένη είναι η διεπαφή "preg", η οποία παρέχει πρόσβαση στη βιβλιοθήκη PCRE regex, που αναπτύχθηκε αρχικά για τη γλώσσα Perl, η οποία περιλαμβάνεται στην PHP. Οι λειτουργίες Preg αναζητούν αντιστοιχίσεις σε μια δεδομένη συμβολοσειρά κειμένου σύμφωνα με ένα συγκεκριμένο μοτίβο στη γλώσσα κανονικής έκφρασης
Μέσα σε ένα σύντομο άρθρο, είναι αδύνατο να αναλυθούν λεπτομερώςΠεριγράψτε ολόκληρη τη σύνταξη των τυπικών εκφράσεων, υπάρχει ειδική βιβλιογραφία για αυτό. Θα δώσουμε μόνο τα βασικά στοιχεία για να δείξουμε τις μεγάλες δυνατότητες για τον προγραμματιστή και να κατανοήσουμε τα παραδείγματα κώδικα.
Στην PHP, το regex ορίζεται επίσημαπολύ δύσκολο, και επομένως απλοποιήστε την περιγραφή. Η κανονική έκφραση είναι μια συμβολοσειρά κειμένου. Αποτελείται από ένα οριοθετημένο πρότυπο και έναν τροποποιητή που καθορίζει τον τρόπο χειρισμού του. Είναι δυνατόν να συμπεριληφθούν διάφορες εναλλακτικές λύσεις και επαναλήψεις στα πρότυπα.
Για παράδειγμα, στην έκφραση / d {3} -d {2} -d {2} / m ο διαχωριστής θα είναι "/", ακολουθούμενο από το μοτίβο και το σύμβολο "Μ" θα είναι τροποποιητής.
Κωδικοποιείται όλη η ισχύς των κανονικών εκφράσεωνχρησιμοποιώντας μεταχαρακτήρες. Ο κύριος μεταχαρακτήρας της γλώσσας είναι μια ανάστροφη κάθετο - "". Αλλάζει τον τύπο του επόμενου χαρακτήρα στον αντίθετο (δηλαδή, ένας συνηθισμένος χαρακτήρας γίνεται μεταχαρακτήρας και το αντίστροφο). Ένας άλλος σημαντικός μεταχαρακτήρας είναι η μπροστινή κάθετος "|", η οποία καθορίζει εναλλακτικές λύσεις για το μοτίβο. Περισσότερα παραδείγματα μεταχαρακτήρων:
^ | Έναρξη αντικειμένου ή γραμμής |
( | Έναρξη υποταγμάτων |
), | Τερματισμός υποδιαγράμματος |
{ | Έναρξη ποσοτικοποίησης |
}} | Τέλος ποσοτικοποίησης |
δ | δεκαδικό ψηφίο από 0 έως 9 |
Δ | οποιονδήποτε μη ψηφίο χαρακτήρα |
με το | κενό, κενό, καρτέλα |
β | σύμβολο λεξιλογίου |
Η PHP αντιμετωπίζει το χώρο ως ξεχωριστό σημαντικό χαρακτήρα κατά την επεξεργασία κανονικών εκφράσεων, επομένως οι εκφράσεις ABCGDE και ABC WHERE είναι διαφορετικές.
Στην PHP, τα κανονικά υποδιαγράμματα περικλείονται σε παρενθέσεις και μερικές φορές αναφέρονται ως "υποεκφράσεις". Εκτελούν τις ακόλουθες λειτουργίες:
Επισήμανση εναλλακτικών λύσεων... Για παράδειγμα, το πρότυπο θερμότητα (μερικά | πουλιά |) ταιριάζει με τις λέξεις "Heat", "firebird" και "ψητό"... Και χωρίς παρένθεση, θα είναι απλώς μια κενή χορδή, "πουλί" και "ψητό".
Ένα "συναρπαστικό" υπόστεγο. Αυτό σημαίνει ότι εάν ένα substring ταιριάζει με το μοτίβο, τότε όλα τα αποτελέσματα επιστρέφονται ως αποτέλεσμα. Για λόγους σαφήνειας, θα δώσουμε ένα παράδειγμα. Δεδομένου του ακόλουθου regex: ο νικητής λαμβάνει ((χρυσό | επίχρυσο) (μετάλλιο | κύπελλο)) - και μια συμβολοσειρά για να βρείτε αγώνες: "Ο νικητής λαμβάνει χρυσό μετάλλιο"... Εκτός από την αρχική φράση, η αναζήτηση θα επιστρέψει: "Χρυσό μετάλλιο", "Μετάλλιο", "χρυσό".
Όταν γράφετε κανονικές εκφράσεις, είναι πολύ συνηθισμένοείναι απαραίτητο να αναλυθούν οι επαναλήψεις αριθμών και συμβόλων. Αυτό δεν είναι πρόβλημα εάν δεν υπάρχουν πάρα πολλές επαναλήψεις. Τι γίνεται όμως αν δεν γνωρίζουμε τον ακριβή αριθμό τους; Σε αυτήν την περίπτωση, πρέπει να χρησιμοποιήσετε ειδικούς μεταχαρακτήρες.
Για να περιγράψουμε τις επαναλήψεις, χρησιμοποιούνται τετραπλασιαστές - μεταχαρακτήρες για τον καθορισμό του αριθμού. Τα Quadrifiers είναι δύο τύπων:
Ο κοινός μετρητής αγγίζει το ελάχιστο καιο μέγιστος επιτρεπόμενος αριθμός επαναλήψεων ενός στοιχείου με τη μορφή δύο αριθμών σε σγουρά τιράντες, για παράδειγμα: x {2,5}. Εάν ο μέγιστος αριθμός επαναλήψεων είναι άγνωστος, παραλείπεται το δεύτερο όρισμα: x {2,}.
Οι συντομευμένοι ποσοτικοποιητές είναι σύμβολα για τις πιο συνηθισμένες επαναλήψεις για την αποφυγή περιττής υπερφόρτωσης σύνταξης. Χρησιμοποιούνται συνήθως τρεις συντομογραφίες:
1. * - μηδέν ή περισσότερες επαναλήψεις, που ισοδυναμεί με {0,}.
2. + - μία ή περισσότερες επαναλήψεις, δηλαδή {1,}.
3.; - μηδέν ή μόνο μία επανάληψη - {0,1}.
Για εκείνους που μαθαίνουν κανονικές εκφράσεις,παραδείγματα είναι το καλύτερο σεμινάριο. Θα δώσουμε μερικά που δείχνουν τις μεγάλες δυνατότητές τους με ελάχιστη προσπάθεια. Όλοι οι κωδικοί προγράμματος είναι πλήρως συμβατοί με PHP 4.x και νεότερες εκδόσεις. Για πλήρη κατανόηση της σύνταξης και της χρήσης όλων των χαρακτηριστικών της γλώσσας, προτείνουμε το βιβλίο του J. Friedl "Regular Expressions", το οποίο εξετάζει πλήρως τη σύνταξη και παρέχει παραδείγματα τυπικών εκφράσεων όχι μόνο στην PHP, αλλά και για το γλώσσες Python, Perl, MySQL, Java, Ruby και C #.
Μια εργασία. Υπάρχει μια ιστοσελίδα όπουζητείται η διεύθυνση email του επισκέπτη. Η κανονική έκφραση πρέπει να ελέγχει την εγκυρότητα της ληφθείσας διεύθυνσης πριν από την αποστολή μηνυμάτων. Η επαλήθευση δεν εγγυάται ότι το καθορισμένο γραμματοκιβώτιο υπάρχει πραγματικά και δέχεται γράμματα. Αλλά μπορεί να εξαλείψει εσκεμμένα λανθασμένες διευθύνσεις.
Η λύση. Όπως με οποιαδήποτε γλώσσα προγραμματισμού, στην PHPΤα regexes επικύρωσης διεύθυνσης email μπορούν να εφαρμοστούν με πολλούς διαφορετικούς τρόπους και τα παραδείγματα σε αυτό το άρθρο δεν είναι η τελική και μόνη επιλογή. Επομένως, σε κάθε περίπτωση, θα παρέχουμε μια λίστα απαιτήσεων που πρέπει να ληφθούν υπόψη κατά τον προγραμματισμό και η συγκεκριμένη εφαρμογή εξαρτάται αποκλειστικά από τον προγραμματιστή.
Έτσι, η έκφραση επικύρωσης ηλεκτρονικού ταχυδρομείου θα πρέπει να ελέγξει τις ακόλουθες συνθήκες:
Ένα παράδειγμα που λαμβάνει υπόψη όλες αυτές τις συνθήκες μπορεί να δει στο παρακάτω σχήμα.
Μια εργασία. Ελέγξτε εάν η δεδομένη συμβολοσειρά κειμένου είναι έγκυρη διεύθυνση URL. Σημειώστε ξανά ότι οι κανονικές εκφράσεις επικύρωσης URL μπορούν να εφαρμοστούν με διάφορους τρόπους.
Η λύση. Η τελική μας έκδοση μοιάζει με αυτήν:
/ ^ (https?: //)? ((da-z.-> +). ([a-z. * [2,6]) ([/ w .-] *) * /? $ /
Τώρα ας αναλύσουμε τα συστατικά του με περισσότερες λεπτομέρειες χρησιμοποιώντας την εικόνα.
σημείο 1 | Δεν πρέπει να υπάρχουν χαρακτήρες μπροστά από τη διεύθυνση URL |
σημείο 2 | Έλεγχος για το υποχρεωτικό πρόθεμα "http" |
σημείο 3 | Δεν πρέπει να υπάρχουν σύμβολα |
σημείο 4 | Εάν υπάρχει "s", η διεύθυνση URL υποδεικνύει μια ασφαλή σύνδεση "https" |
σελ. 5 | Απαιτούμενο τμήμα "//" |
σημείο 6 | Χωρίς σύμβολα |
σελ. 7-9 | Έλεγχος της εγκυρότητας του τομέα πρώτου επιπέδου και της παρουσίας μιας κουκκίδας |
σελ. 10-13 | Έλεγχος της ορθογραφίας του τομέα και της περιόδου δεύτερου επιπέδου |
σελ. 14-17 | Δομή αρχείου μιας διεύθυνσης URL - ένα σύνολο αριθμών, γραμμάτων, κάτω παύλες, ενωτικά, τελείες και μια κατακόρυφη κάθετο |
Μια εργασία. Είναι απαραίτητο να ελέγξετε την ορθότητα του αριθμού πλαστικής κάρτας που έχετε εισαγάγει στα πιο συνηθισμένα συστήματα πληρωμής. Μια επιλογή εξετάζεται μόνο για κάρτες Visa και MasterCard.
Η λύση. Κατά τη δημιουργία μιας έκφρασης, να γνωρίζετεπιθανή παρουσία κενών στον εισαγόμενο αριθμό. Οι αριθμοί στην κάρτα χωρίζονται σε ομάδες για εύκολη ανάγνωση και υπαγόρευση. Επομένως, είναι φυσικό για ένα άτομο να προσπαθήσει να εισαγάγει έναν αριθμό με αυτόν τον τρόπο (δηλαδή χρησιμοποιώντας κενά).
Γράψτε μια γενική έκφραση που λαμβάνει υπόψηπιθανοί χώροι και παύλες είναι πιο δύσκολο από το να ρίχνεις όλους τους χαρακτήρες εκτός από τους αριθμούς. Επομένως, συνιστάται η χρήση του μετα-χαρακτήρα / D στην παράσταση, η οποία αφαιρεί όλους τους χαρακτήρες εκτός από τους αριθμούς.
Τώρα μπορείτε να πάτε απευθείας στοέλεγχος του αριθμού. Όλες οι εταιρείες πιστωτικών καρτών χρησιμοποιούν μια μοναδική μορφή αριθμού. Το παράδειγμα το χρησιμοποιεί και ο πελάτης δεν χρειάζεται να εισαγάγει το όνομα της εταιρείας - αναγνωρίζεται από τον αριθμό. Οι κάρτες Visa ξεκινούν πάντα με 4 και έχουν 13 ή 16 ψηφία. Η MasterCard ξεκινά στην περιοχή 51-55 με μήκος 16. Ως αποτέλεσμα, έχουμε την ακόλουθη έκφραση:
Πριν από την επεξεργασία της παραγγελίας, μπορείτε επιπλέον να ελέγξετε το τελευταίο ψηφίο του αριθμού, το οποίο υπολογίζεται χρησιμοποιώντας τον αλγόριθμο Luna.
Μια εργασία. Έλεγχος της ορθότητας του καταχωρισμένου αριθμού τηλεφώνου.
Η λύση. Αριθμός ψηφίων σε σταθερό και κινητόοι αριθμοί τηλεφώνου διαφέρουν σημαντικά από χώρα σε χώρα, επομένως είναι αδύνατο να ελέγχετε καθολικά έναν αριθμό τηλεφώνου χρησιμοποιώντας κανονικές εκφράσεις. Όμως οι διεθνείς αριθμοί έχουν αυστηρή μορφή και είναι ιδανικοί για τον έλεγχο των προτύπων. Επιπλέον, όλο και περισσότεροι εθνικοί τηλεφωνικοί φορείς προσπαθούν να συμμορφωθούν με ένα ενιαίο πρότυπο. Η δομή του ζητήματος έχει ως εξής:
+ CCC.NNNNNNNNNxEEEE, όπου:
- Το C είναι ένας κωδικός χώρας 1-3 ψηφίων.
- N - αριθμός έως 14 ψηφία.
- Το Ε είναι μια προαιρετική επέκταση.
Το συν είναι απαραίτητο και το x υπάρχει μόνο όταν απαιτείται επέκταση.
Ως αποτέλεσμα, έχουμε την ακόλουθη έκφραση:
^ + [0-9] {1,3}. [0-9] {4,14} (?: X. +); $
Μια εργασία. Πρέπει να βεβαιωθείτε ότι ένας ακέραιος αριθμός από ένα καθορισμένο εύρος ταιριάζει. Επιπλέον, απαιτείται οι τυπικές εκφράσεις να βρίσκουν μόνο αριθμούς από ένα εύρος τιμών.
Απόφαση. Ακολουθούν ορισμένες εκφράσεις για πολλές από τις πιο συχνές περιπτώσεις:
Προσδιορίστε την ώρα από 1 έως 24 | ^ (1 [0-2] | [1-9]) $ |
Ημέρα εντός μηνός 1-31 | ^ (3 [01] | [12] [0-9] | [1-9]) $ |
Δεύτερο ή λεπτό 0-59 | ^ [1-5]; [0-9] $ |
Ένας αριθμός από 1 έως 100 | ^ (100 | [1-9]; [0-9]) $ |
Ημέρα του έτους 1 - 366 | ^ (36 [0-6] | 3 [0-5] [0-9] | [12] [0-9] {2} | [1-9] [0-9]?) $ |
Μια εργασία. Πρέπει να προσδιορίσετε εάν η καθορισμένη συμβολοσειρά είναι έγκυρη διεύθυνση IP IPv4 στην περιοχή 000.000.000.000-255.255.255.255.
Η λύση. Όπως σε κάθε εργασία στην PHP, υπάρχουν πολλές παραλλαγές μιας κανονικής έκφρασης. Για παράδειγμα, αυτό:
Έλεγχος κανονικών εκφράσεων για ορθότητα γιαΟι αρχάριοι προγραμματιστές μπορεί να είναι προκλητικοί λόγω της πολυπλοκότητας της σύνταξης, η οποία διαφέρει από τις "κανονικές" γλώσσες προγραμματισμού. Για την επίλυση αυτού του προβλήματος, υπάρχουν πολλοί διαδικτυακοί ελεγκτές έκφρασης που σας επιτρέπουν να ελέγχετε εύκολα την ορθότητα του δημιουργημένου προτύπου σε πραγματικό κείμενο. Ο προγραμματιστής εισάγει μια έκφραση και δεδομένα για επαλήθευση και βλέπει αμέσως το αποτέλεσμα της επεξεργασίας. Συνήθως υπάρχει επίσης μια ενότητα αναφοράς, η οποία περιγράφει λεπτομερώς τακτικές εκφράσεις, παραδείγματα και διαφορές υλοποίησης για τις πιο κοινές γλώσσες προγραμματισμού.
Αλλά εμπιστευτείτε πλήρως τα αποτελέσματα των διαδικτυακών υπηρεσιώνδεν συνιστάται για όλους τους προγραμματιστές PHP. Ένα regex, γραμμένο και δοκιμασμένο προσωπικά, είναι ενημερωμένο και εγγυημένο ότι είναι χωρίς σφάλματα.