⊗ppPmRgGL 229 of 447 menu

Περιορισμός της απληστίας στις κανονικές εκφράσεις στην PHP

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

Ας το εξετάσουμε με ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε την ακόλουθη συμβολοσειρά:

<?php $str = 'aeeex zzz x kkk'; ?>

Ας υποθέσουμε ότι σε αυτή τη συμβολοσειρά θέλουμε να βρούμε την υποσυμβολοσειρά 'aeeex' σύμφωνα με το ακόλουθο μοτίβο: το γράμμα 'a', στη συνέχεια οποιοσδήποτε χαρακτήρας μία ή περισσότερες φορές, έπειτα το γράμμα 'x'.

<?php $res = preg_replace('#a.+x#', '!', $str); ?>

Αναμένουμε ότι ως αποτέλεσμα στη μεταβλητή θα καταγραφεί η συμβολοσειρά '! zzz x kkk'. Ωστόσο, δεν συμβαίνει αυτό - στη μεταβλητή εμφανίζεται η συμβολοσειρά '! kkk'.

Το όλο θέμα είναι ότι η κανονική μας έκφραση αναζητά όλους τους χαρακτήρες από το γράμμα 'a' έως το γράμμα 'x'. Αλλά στη συμβολοσειρά μας υπάρχουν δύο γράμματα 'x'. Λόγω της απληστίας, η κανονική έκφραση αναζητά μέχρι το τελευταίο x, καταλαμβάνοντας έτσι κάτι διαφορετικό από αυτό που περιμέναμε.

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

Για να περιορίσετε την απληστία, πρέπει να βάλετε ένα ερωτηματικό μετά τον τελεστή επανάληψης:

<?php $res = preg_replace('#a.+?x#', '!', $str); ?>

Η απληστία μπορεί να περιοριστεί σε όλους τους τελεστές επανάληψης, ως εξής: *?, ?? και {}?.

Δίνεται η συμβολοσειρά:

<?php $str = 'aba accca azzza wwwwa'; ?>

Γράψτε μια κανονική έκφραση που θα βρει όλες τις συμβολοσειρές στα άκρα των οποίων υπάρχουν τα γράμματα 'a', και θα αντικαταστήσει κάθε μία από αυτές με '!'. Μεταξύ των γραμμάτων a μπορεί να υπάρχει οποιοσδήποτε χαρακτήρας (εκτός από 'a').

Ελληνικά
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Χρησιμοποιούμε cookie για τη λειτουργία του ιστότοπου, την ανάλυση και την εξατομίκευση. Η επεξεργασία των δεδομένων γίνεται σύμφωνα με την Πολιτική Απορρήτου.
αποδοχή όλων ρύθμιση απόρριψη