Κρίσιμης σημασίας έννοιες πίσω Advanced τακτικός εκφράσεις
Κανονικές εκφράσεις (ή regex) είναι ένα ισχυρό μέσο για να διασχίσουν μεγάλες χορδές για να βρουν πληροφορίες. Βασίζονται σε βασικές πρακτικές στη δομή μιας συμβολοσειράς για εργασία μαγεία τους. Δυστυχώς, η απλή κανονική έκφραση είναι σε θέση να αντιμετωπίσουν με πολύπλοκα σχήματα και σύμβολα. Για να αντιμετωπίσει αυτό το δίλημμα, μπορείτε να χρησιμοποιήσετε προηγμένες συνήθεις εκφράσεις.
Παρακάτω, παρουσιάζουμε μια εισαγωγή στις προηγμένες συνήθεις εκφράσεις, με οκτώ συνήθως χρησιμοποιούνται έννοιες και παραδείγματα. Κάθε παράδειγμα περιγράφει έναν απλό τρόπο για να ταιριάζουν με τα πρότυπα σε πολύπλοκες χορδές. Εάν δεν έχετε ακόμη εμπειρία με τις βασικές κανονικές εκφράσεις, ρίξτε μια ματιά στο συγκεκριμένο άρθρο για να ξεκινήσετε. Η σύνταξη που χρησιμοποιείται εδώ ταιριάζει Perl συμβατές τακτικές της PHP εκφράσεις.
[Με την ευκαιρία, εσείς ήξερε έχουμε μια ολοκαίνουργια δωρεάν Smashing Email Newsletter ; Εγγραφείτε τώρα και πάρτε τα νωπά σύντομες συμβουλές και κόλπα για την Τρίτη!]
1. Απληστία / Οκνηρία

Όλοι οι φορείς εκμετάλλευσης regex επανάληψη είναι άπληστοι. Προσπαθούν να ταιριάζει όσο το δυνατόν περισσότερο σε μια συμβολοσειρά. Δυστυχώς, αυτό ενδέχεται να μην είναι πάντα το επιθυμητό αποτέλεσμα. Έτσι, οι φορείς εκμετάλλευσης τεμπέλης χρησιμοποιούνται για την επίλυση αυτού του προβλήματος. Ταιριάζουν μόνο το μικρότερο δυνατό ρυθμό και χρησιμοποιούνται με την προσθήκη ενός «? μετά των αντίστοιχων άπληστους φορέα. Εναλλακτικά, το «τροποποιητή U» μπορεί να χρησιμοποιηθεί για να κάνει όλους τους φορείς εκμετάλλευσης repetiton τεμπέλης. Διαφοροποίηση μεταξύ απληστία και η τεμπελιά είναι το κλειδί για την πλήρη κατανόηση προηγμένες συνήθεις εκφράσεις.
Άπληστους επιχειρηματίες
Ο φορέας εκμετάλλευσης * ταιριάζει με την προηγούμενη έκφραση 0 ή περισσότερες φορές. Είναι ένας άπληστος φορέας. Εξετάστε τα εξής έκφραση:
preg_match ("/ <h1> .* <\ / h1> / ',' <h1> Αυτό είναι μια επικεφαλίδα. </ h1> <h1> Αυτός είναι ένας άλλος ένας. </ h1> ', $ αγώνες)? Υπενθυμίζω ότι ένα αρχείο. νοείται κάθε χαρακτήρα, εκτός από μια νέα γραμμή. Η παραπάνω κανονική έκφραση είναι ψάχνει για μια ετικέτα H1 και όλα τα περιεχόμενά του. Χρησιμοποιεί το. και τους φορείς εκμετάλλευσης * να ταιριάζει με συνεχώς κάτι μέσα στην ετικέτα. Αυτό το μοτίβο θα ταιριάζει:
<h1> Αυτή είναι μια επικεφαλίδα. </ h1> <h1> Αυτός είναι ένας άλλος ένας. </ h1> Επιστρέφει το σύνολο εγχόρδων. Ο φορέας εκμετάλλευσης * θα ταιριάξει συνεχώς τα πάντα - ακόμη και στη μέση το κλείσιμο h1 tag - γιατί είναι άπληστοι. Ταιριάζουν με ολόκληρη σειρά είναι το καλύτερο που μπορεί να κάνει.
Lazy Τελεστές
Ας αλλάξουν τα ανωτέρω φορέα με την προσθήκη ενός «? μετά από αυτό. Αυτό θα καταστήσει τεμπέλης:
/ <h1> .*; <\ / H1> / Το regex πληροί πλέον το καθήκον του και ταιριάζει με το πρώτο μόνο h1 tag. Ένας άλλος άπληστος φορέας εκμετάλλευσης που χρησιμοποιεί αυτό το ίδιο ακίνητο είναι (n,). Αυτό ταιριάζει με το προηγούμενο ν έκφραση ή περισσότερες φορές. Εάν χρησιμοποιηθεί χωρίς ένα ερωτηματικό, το αναζητά τις πιο πιθανές επαναλήψεις. Σε αντίθετη περίπτωση, ξεκινά από επαναλήψεις n:
# Δημιουργία μιας String $ str = 'Hihi'? # Αγώνα χρησιμοποιώντας τους άπληστους (n,) preg_match χειριστή ('/ (hi) (1 ,}/', $ str, $ αγώνες)? # Αγώνες [0] θα να είναι «# Hihi 'αυτό σε αγώνα με το τεμπέλικο (n,); preg_match χειριστή ('/ (hi) (1 ,}?/', $ str, $ αγώνες)? # αγώνες [0] θα είναι «γεια»
2. Επιστροφή Αναφορά

Αυτό που κάνει
Επιστροφή παραπομπή είναι ένας τρόπος για να αναφερθώ στο παρελθόν συμφωνημένα πρότυπα μέσα σε μια κανονική έκφραση. Για παράδειγμα, ρίξτε μια ματιά σε αυτό το απλό regex που ταιριάζει με μια έκφραση σε εισαγωγικά:
# Δημιουργία μιας σειράς αγώνων $ αγώνες = array ()? # Δημιουργήστε ένα String $ str = "\" Αυτό είναι ένα «string '\" "? # Traverse αυτό με τακτικές εκφράσεις preg_match (" / (\ "|») .*; (\ "|')/", $ str, $ αγώνες)? # Εκτύπωση του αγώνα echo $ αγώνες [0]? Δυστυχώς, αυτό δεν θα ταιριάζουν σωστά το string. Αντ 'αυτού, θα εκτυπωθεί:
"Πρόκειται για μια« Αυτή η κανονική έκφραση ταιριάζει με το άνοιγμα διπλή προσφορά, αλλά βρίσκει ένα διαφορετικό είδος παράθεση για να το κλείσετε. Αυτό οφείλεται στο γεγονός ότι δόθηκε η δυνατότητα να επιλέξουν ένα διπλό ή δύο μονά παράθεση στο τέλος. Για να διορθώσετε αυτό, μπορείτε να χρησιμοποιήσετε το πίσω αναφοράς. Οι εκφράσεις \ 1 \ 2, ...., \ 9 κατέχουν οι αναφορές σε προηγούμενα αιχμαλωτισμένα subpatterns. Η πρώτη συμφωνημένα παράθεση, στην περίπτωση αυτή, θα πραγματοποιηθεί από τη μεταβλητή \ 1.
Πώς να το χρησιμοποιήσει
Για να ισχύσει αυτή η έννοια στο προαναφερόμενο παράδειγμα, η χρήση \ 1 στη θέση της τελευταίας παραθέτω:
preg_match ('/("| \').*? \ 1 / ", $ str, $ αγώνες)? Αυτό θα είναι πλέον σωστά την επιστροφή:
"Πρόκειται για ένα« string » Θυμηθείτε ότι πίσω συσχέτιση μπορεί επίσης να χρησιμοποιηθεί από preg_replace . Σημειώστε ότι, αντί του \ 1 ... \ 9, θα πρέπει να χρησιμοποιήσετε το $ 1 ... 9 δολάρια ... $ n (οποιοδήποτε αριθμό από αυτές θα λειτουργήσει). Για παράδειγμα, εάν θέλετε να αντικαταστήσετε όλα τα tags σκέψη με το κείμενο που τους αντιπροσωπεύει, χρήση:
$ Text = preg_replace ('/ <p> (.*?)< \ / p> /', "<p> $ 1 </ p>", $ html)? Το $ 1 αναφορά πίσω κρατά το κείμενο μέσα στο εδάφιο και χρησιμοποιείται στην αντικατάσταση του προτύπου ίδια. Αυτή η καθ 'όλα έγκυρη έκφραση δείχνει έναν εύκολο τρόπο να έχουν πρόσβαση συμφωνημένα πρότυπα ακόμα και αν αντικαθιστά.
3. Ομάδες που ονομάζεται
Όταν χρησιμοποιείτε πολλαπλές αναφορές πίσω, μια κανονική έκφραση που μπορεί γρήγορα να γίνει συγχέοντας και δύσκολο να κατανοηθεί. Ένας εναλλακτικός τρόπος για την παραπομπή προς τα πίσω είναι χρησιμοποιώντας το όνομα των ομάδων. Μια ομάδα με το όνομα καθορίζεται με τη χρήση (?P<name>pattern) , όπου όνομα είναι το όνομα της ομάδας και ο τρόπος είναι η κανονική έκφραση στην ίδια την ομάδα. Η ομάδα στη συνέχεια μπορεί να αναφέρεται το (; P = όνομα). Για παράδειγμα, σκεφτείτε τα εξής:
/ (? P <quote> "|').*?(? P = παράθεση) / Η ανωτέρω έκφραση θα δημιουργήσει το ίδιο αποτέλεσμα με τα προηγούμενα πίσω παράδειγμα αναφοράς, αλλά αντ 'αυτού από τη χρήση που ονομάζεται ομάδες. Είναι επίσης πολύ ευκολότερο να διαβάσει.
Επώνυμη ομάδες είναι επίσης χρήσιμη όταν κοσκίνισμα μέσω της σειράς των αγώνων. Το όνομα που δίνεται σε ένα συγκεκριμένο μοτίβο είναι και το κλειδί των αντίστοιχων αγώνων πίνακα.
preg_match ("/ (? P <quote>" | \')/', "'" String ", $ αγώνες)? # Αυτό θα εμφανίσει" "" echo $ αγώνες [1]? # Αυτό θα print "" " , καθώς πρόκειται για μια ομάδα με το όνομα echo $ ταιριάζει με παράθεση [']? Έτσι, με την ονομασία οι ομάδες δεν κάνουν μόνο κώδικα πιο εύκολο να το διαβάσετε, αλλά και να την οργανώσουν.
4. Word Όρια

Word όρια είναι θέσεις σε μια σειρά που έρχονται από ένα χαρακτήρα και μια λέξη-λέξη μη χαρακτήρα. Η ειδικότητα αυτών των ορίων, αποτελεί το γεγονός ότι δεν ταιριάζουν στην πραγματικότητα ένα χαρακτήρα. Το μήκος τους είναι μηδέν. Το \b κανονική έκφραση ταιριάζει με κανένα σύνορο λέξη.
Δυστυχώς, τα όρια είναι τόσο συχνά το αποκορυφωμένο πάνω ότι πολλοί δεν αναγνωρίζουν πραγματική τους σημασία. Για παράδειγμα, ας υποθέσουμε ότι θέλετε να ταιριάζει με τη λέξη "εισαγωγή":
/ Εισαγωγής / Πρόσεχε! Κανονικές εκφράσεις μπορεί να είναι δυσνόητο. Η παραπάνω εκδήλωση θα είναι επίσης αγώνας:
σημαντικών Μπορείτε να σκεφτείτε ότι είναι τόσο απλό όσο προσθέτοντας ένα διάστημα πριν και μετά την εισαγωγή να αποφευχθούν αυτές οι ψεύτικες αγώνες:
/ Εισαγωγής / Αλλά τι γίνεται με αυτή την περίπτωση;
Ο έμπορος ψήφισε για την εισαγωγή Όταν εισαγωγής στην αρχή ή το τέλος ενός string, η τροποποιημένη regex θα αποτύχει. Έτσι, η διαίρεση αυτή επάνω σε περιπτώσεις που απαιτείται:
/ (^ Εισαγωγής εισαγωγών | | εισαγωγής $) / i Ανατρέχοντας στην κανονική έκφραση μας, δεν λαμβάνει περιόδους ή άλλα σημεία στίξης υπόψη. Ακριβώς για να ταιριάζουν με αυτό και μόνο λέξη, μια κανονική έκφραση μπορεί να είναι κάπως έτσι:
/ (^ (:|;|,)? Εισαγωγής κατά την εισαγωγή | (:|;|,)? | εισαγωγής (\. | \ ?|!)?$)/ I Αυτό είναι πολύ κώδικα για να ταιριάζει μόνο μια λέξη. Για το λόγο αυτό όρια των λέξεων είναι τόσο σημαντικές. Για να ολοκληρώσει την παραπάνω δήλωση και πολλές άλλες παραλλαγές με όρια των λέξεων, το μόνο που χρειάζεται είναι:
/ \ Bimport \ b / Αυτό θα ταιριάζει σε κάθε περίπτωση παραπάνω και πολλά άλλα. \b ευελιξία s 'προέρχεται από το γεγονός ότι αυτή να συνδυάζεται με συμβολοσειρά μηδενικού μήκους. Το μόνο που ταιριάζει είναι ένα φανταστικό χώρο μεταξύ των δύο χαρακτήρων. Ελέγχει αν ένας από τους χαρακτήρες είναι ένας χαρακτήρας μη λεκτικά και το άλλο είναι ένα χαρακτήρα λέξη. Αν ναι, αυτό ταιριάζει. Εάν η αρχή ή το τέλος ενός string απαντάται \b το αντιμετωπίζει ως ένα μη λεκτικό χαρακτήρα. Επειδή το i εισαγωγής εξακολουθεί να θεωρείται ένας χαρακτήρας λέξη, θα ταιριάζει με την εισαγωγή.
Σημειώστε ότι το αντίθετο του \ b είναι \ Β. Ο εν λόγω φορέας θα ταιριάζει με το χώρο, ανάμεσα σε δύο λέξεις ή δύο μη λέξη χαρακτήρες. Έτσι, αν θέλετε να ταιριάζει με «γεια», μέσα σε μια άλλη λέξη, θα μπορούσατε να χρησιμοποιήσετε:
\ BHI \ B 5. Ομάδες Ατομικής

Ατομικής ομάδες είναι ομάδες ειδικών regex που είναι μη σύλληψη. Είναι συνήθως χρησιμοποιούνται για την αύξηση της αποτελεσματικότητας της μια κανονική έκφραση, αλλά μπορεί επίσης να εφαρμοστεί για να εξαλειφθούν ορισμένες αγώνες. Ατομικής ομάδας η οποία προσδιορίζεται από τη χρήση (;> πρότυπο):
/ (?> | Του παρόντος) / Όταν ο κινητήρας regex ταιριάζει μια ατομική ομάδα, θα απορρίψει backtracting θέσεις που ήρθε με όλες τις μάρκες στο εσωτερικό του. Θεωρούν ότι πρέπει να σπάσουμε λέξη «. Χρησιμοποιώντας την παραπάνω κανονική έκφραση, ο κινητήρας regex θα προσπαθήσει για πρώτη φορά να ταιριάζει με το μοτίβο «του», σπάζοντας το «. Δεν θα βρείτε έναν αγώνα. Σε αυτό το σημείο, η ατομική ομάδα θα κλωτσούν μέσα, ο κινητήρας του θα απορρίψει όλες τις θέσεις υπαναχώρηση. Αυτό σημαίνει ότι δεν θα ψάξει για «το παρόν», μέσα «σπάζοντας». Γιατί; Σε περίπτωση που «του» δεν επέστρεψε αγώνα, τότε προφανώς «αυτό» (που περιλαμβάνει «του») δεν θα επιστρέψει θετικό είτε.
Το παραπάνω παράδειγμα δεν είχε πολλές πρακτικές χρήσεις. Θα μπορούσαμε επίσης να χρησιμοποιηθεί /t?his?/ αντ 'αυτού. Κοιτάξτε το ακόλουθο κείμενο:
/ \ B (μηχανικός | χαράξουμε | τέλος) \ b / μηχανικός Αν ο κινητήρας regex δίνεται η λέξη «μηχανικού», θα ταιριάζουν σωστά ». Το επόμενο σύνορο λέξη, \ b, δεν θα ταιριάζουν. Έτσι, θα περάσουμε στην επόμενη αγωνιστική: χαράζω. Συνειδητοποιεί ότι η «eng» αγώνες, αλλά οι υπόλοιποι δεν το κάνουν. Τέλος, «τέλος», επιχειρείται και επίσης απέτυχε. Αν κοιτάξετε προσεκτικά, θα διαπιστώσετε ότι μόλις ο κινητήρας ταιριάζει «μηχανικός» και παραλείπει την τελευταία λέξη όριο, δεν μπορεί να συναγωνιστεί ενδεχομένως "χαράζω» ή «τέλος». Αυτοί οι δύο αγώνες είναι μικρότερες από ό, τι λέξεις μηχανικός », και έτσι το regex κινητήρας δεν θα πρέπει να συνεχίσει με τις άλλες δοκιμές.
/ \ B (;> μηχανικός | χαράξουμε | τέλος) \ b / Η παραπάνω είναι μια πολύ καλύτερη εναλλακτική λύση που θα σώσει το regex χρόνο κινητήρα και να βελτιώσει την αποτελεσματικότητα του κώδικα.
6. Αναδρομή

Αναδρομή σε κανονικές εκφράσεις μπορούν να χρησιμοποιηθούν για να ταιριάζει με ένθετες δομές, όπως παρενθέσεις, (αυτό (η)), και τις ετικέτες HTML, <div></div> . Απαιτούν τη χρήση του (?R) , ο αερομεταφορέας που ταιριάζει με αναδρομική υπο-μοντέλα. Εξετάστε την κανονική έκφραση που ταιριάζει με ένθετα παρένθεση:
/ \ (((?>[^()]+)|(? R)) * \) / Οι εξόχως απόκεντρες παρένθεση σε αυτό το κανονική έκφραση ταιριάζει με την έναρξη της ένθετα κατασκευάσματος. Στη συνέχεια, έρχεται ένα προαιρετικό φορέα και η οποία μπορεί να ταιριάξει είτε μη παρενθετική χαρακτήρες ( ?>[^()]+ ) ή ολόκληρης της έκφρασης και πάλι σε ένα υπο-πρότυπο, (? R). Παρατηρήσετε ότι ο συγκεκριμένος επιχειρηματίας θα επαναληφθεί όσες φορές είναι δυνατόν να ταιριάζει με όλα τα ένθετα παρενθέσεις.
Ένα άλλο παράδειγμα της αναδρομής στην εργασία είναι τα εξής:
/((?>[^]+)|((? R )))*/ Η παραπάνω έκφραση συνδυάζει ομάδες χαρακτήρα, άπληστους επιχειρηματίες, back-εντοπισμού και ατομικής ομάδες για να ταιριάζει με ένθετες ετικέτες. Η πρώτη ομάδα παρενθέσεις ([\ w] +) ταιριάζει με το όνομα ετικέτας για τη χρήση αργότερα στην κανονική έκφραση. Στη συνέχεια, κατά να ταιριάζει με το υπόλοιπο της ετικέτας. Η επόμενη παρενθέσεις υπο-έκφρασης είναι παρόμοια με την παραπάνω. Είτε αγώνων μη tag χαρακτήρες (?>[^]+) ή recurses σε μια άλλη ετικέτα (; R). Τέλος, το τελευταίο μέρος της έκφρασης ταιριάζει με το tag κλεισίματος.
7. Callbacks

Ορισμένους αγώνες με ένα σχήμα που μπορεί να απαιτεί ιδιαίτερες τροποποιήσεις. Για να ισχύσει πολλαπλές ή πολύπλοκες αλλαγές, επιστροφές κλήσης μπορεί να χρησιμοποιηθεί. Μια επανάκλησης χρησιμοποιείται για τη δυναμική υποκατάσταση Οι φράσεις του preg_replace_callback λειτουργία. Παίρνουν σε μια συνάρτηση ως παράμετρο για να χρησιμοποιήσετε όταν ένας αγώνας που βρέθηκαν. Η λειτουργία αυτή λαμβάνει τη σειρά αγώνα ως παράμετρος και επιστρέφει μια τροποποιημένη σπάγκο που χρησιμοποιείται ως αντικατάσταση.
Ως παράδειγμα, θεωρήστε μια κανονική έκφραση που αλλάζει όλες τις λέξεις σε κεφαλαία γράμματα σε μια δεδομένη συμβολοσειρά. Δυστυχώς, η PHP δεν έχει χειριστή regex που αλλάζει ένας χαρακτήρας σε μια διαφορετική υπόθεση. Για να ολοκληρώσει αυτό το έργο, επανάκλησης μπορεί να χρησιμοποιηθεί. Πρώτον, η έκφραση πρέπει να ταιριάζει με όλα τα γράμματα που πρέπει να κεφαλαιοποιηθεί:
/ \ B \ w / Οι παραπάνω χρήσεις τόσο όρια των λέξεων και κατηγορίες χαρακτήρων για εργασία. Τώρα που έχουμε αυτή την έκφραση, μπορούμε να γράψετε ένα επανάκλησης λειτουργία:
upper_case λειτουργία ($ αγώνες) (strtoupper επιστροφή ($ αγώνες [0])?) upper_case παίρνει σε μια σειρά αγώνων και επιστρέφει το σύνολο συμφωνημένα μοτίβο με κεφαλαία. $matches[0] , στην προκειμένη περίπτωση, αποτελεί η επιστολή που πρέπει να κεφαλαιοποιούνται. Όλα αυτά μπορεί τώρα να βάλει μαζί με τη preg_replace_callback λειτουργία:
preg_replace_callback ('/ \ b \ w / "," upper_case ", $ str)? Αυτή είναι η δύναμη ενός απλού επανάκλησης.
8. Σχολιάζοντας

Σχολιάζοντας δεν είναι ένας τρόπος για να ταιριάζει πραγματικά χορδές, αλλά είναι ένα από τα πιο σημαντικά τμήματα των τακτικών εκφράσεις. Όπως μπορείτε κατάδυση σε βάθος μεγαλύτερο, πιο σύνθετες εκφράσεις, καθίσταται δύσκολο να αποκρυπτογραφηθεί τι είναι πραγματικά ταιριάζουν. Χρησιμοποιώντας τις παρατηρήσεις στη μέση του κανονικές εκφράσεις είναι ο ιδανικός τρόπος για να ελαχιστοποιηθούν τέτοια σύγχυση.
Για να τοποθετήσετε ένα σχόλιο μέσα σε μια κανονική έκφραση, χρησιμοποιήστε το (?#comment) μορφή. Αντικαταστήστε το "σχόλιο" με τη λέξη (-ες) της επιλογής σας:
/ (? # Ψηφίο) \ d / Είναι ιδιαίτερα σημαντικό να σχολιάσει τις συνήθεις εκφράσεις που θα καταστήσει προσιτό στο κοινό. Οι χρήστες του regex σας θα είναι σε θέση να κατανοήσει εύκολα και να τροποποιήσουν το σχέδιο για να καλύψουν τις ανάγκες τους. Μπορεί ακόμη και πάει τόσο μακριά ώστε να σας βοηθήσει να το αποκρυπτογραφήσει κατά την αναθεώρηση του προγράμματος.
Σκεφτείτε να χρησιμοποιήσετε το "x" ή (; x) modifier για την δωρεάν διαστήματα λειτουργία με σχόλια. Αυτό προκαλεί μια κανονική έκφραση για να αγνοήσει άσπρο διάστημα μεταξύ μαρκών. Όλοι οι χώροι μπορούν ακόμα να αναπαρασταθεί με [ ] ή \ (το backslash και ένα χώρο):
/ \ D # ψηφία] [\ space # w + # λέξη / x Το παραπάνω είναι το ίδιο:
/ \ D (; # ψηφίο) [] (? # Χώρος) \ w + (? # Λέξη) / Να δημιουργείτε πάντα καλά τεκμηριωμένη κωδικό.
Περαιτέρω πηγές
- Τακτικές-Expressions.info
Ολοκληρωμένη ιστοσελίδα για την τακτική εκφράσεις - Εξαπατήσει Φύλλο
Ενημερωτική συνήθεις εκφράσεις εξαπατήσει φύλλο - Regex Γεννήτρια
JavaScript γεννήτρια κανονικές εκφράσεις
(Al)

