PHP reguliere expressies - Deel VI Inleiding Veel van de voorbeelden die we tegenkwamen zijn eenvoudige voorbeelden. In dit deel kijken we naar twee voorbeelden die zijn veeleisender. Voordat we dit deel van de serie, zullen we praten over wat wordt genoemd Backtracking. Stappen die nodig zijn om een Regex bouwen Dit zijn de stappen die nodig zijn om een reguliere expressie te bouwen: * Geef de taak in detail * Breek het probleem in kleinere delen, * Vertalen van de kleine onderdelen in reguliere expressies, * Combineer de reguliere expressies, * Optimaliseer de finale gecombineerde reguliere expressies.
Twee voorbeelden Voorbeeld 1 hexadecimale Color Code Controle opgeven Task in Detail Een voorbeeld van een hexadecimale kleurcode is # 4C8. Een ander voorbeeld is # 44CC88. * Een hexadecimale code begint met een hekje, gevolgd door 3 hexadecimale getallen of 6 hexadecimale getallen. * Hexadecimale cijfers zijn: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E en F. * De hexadecimale letters kan in kleine of hoofdletters. Breaking Down het probleem in kleinere delen * Het begint met een #.
* Het wordt gevolgd door 3 hexadecimale getallen of * 6 hexadecimale getallen * Er is geen teken na de 3 of 6 hexadecimale cijfers. Vertalen in reguliere expressies Er zijn drie kleine onderdelen boven. Het eerste deel geeft de reguliere expressie: /^ # /Het tweede deel geeft de reguliere expressie: /[0-9a-FA-F] {3} /het derde deel geeft de reguliere expressie: /[0-9a-FA-F] { 6} /Het laatste deel geeft de reguliere expressie: /$ /De combinatie van de reguliere expressies Dit is de gecombineerde regex: /^ # ([0-9a-FA-F] {3} $) | ([0-9a-FA-F ] {} 6 $) /Let op de alternatieve metateken, | de drie of zes hexadecimale cijfers.
Let ook op de haakjes die de alternatieve groepen te scheiden. Het optimaliseren van de gecombineerde Regex Dit betekent dat het verkorten van de gecombineerde regex. Merk op dat 0-9 wordt afgekort tot \\ d. Dus in de gecombineerde regex, veranderen we de twee exemplaren van 0-9 \\ d. De geoptimaliseerde regex is: /^ # ([\\ da-fA-F] {3} $) | ([\\ da-fA-F] {6} $) /Deze uitdrukking is korter dan de bovengenoemde twee karakters. De volgende code illustreert dit: $ subject = "# 44CC88"; if (preg_match ("/^ # ([\\ da-FA-F] {3} $) | ([\\ da-FA-F] {6} $) /", $ onderwerp)) echo "Matched".
"Else echo" Niet Matched "."?> Voorbeeld 2 Gebruikersnaam Controleer opgeven Task in Detail Stel dat we een site waar gebruikers inloggen. We kunnen de gebruiker dat zijn naam in kleine letters of hoofdletters en /of cijfers van nul tot 9 en /of de underscore moet bevatten vertellen, _. Wij dringen erop aan dat de naam niet moet minder dan 3 letters of meer die 18 tekens. In dit voorbeeld hebben we de specificatie informatie opgelegd.
Breaking Down het probleem in kleinere delen Een loginnaam bestaat uit * letters van het alfabet in kleine of hoofdletters tussen de 3 tot 18 letters, inclusief, en /of * cijfers 0-9 tussen de 3 tot 18 cijfers, inclusief, en /of * de underscore tussen de 3 tot 18 cijfers, inclusief. Dit betekent dat u kunt tot 18 underscores voor een naam. Laten we waarmee eenvoud. * We moeten het onderwerp touwtje te beperken tot 3 of 6 karakters.
Vertalen in regexes De reguliere expressie voor het eerste punt is: /^ [a-zA-Z] {3,18} $ /De reguliere expressie voor het tweede punt is: /^ [0-9] {3,18} $ /De regex voor het derde punt is: /^ [_] {3,18} $ /Het vierde punt is inherent aan de bovenstaande reguliere expressies. De combinatie van de reguliere expressies in het gedeelte af te breken, worden de bovengenoemde drie punten in combinatie met de zin, "en /of" Er is geen directe manier om dit te doen, dus we moeten het afleiden.
Dit is de gecombineerde regex: /^ [a-zA-Z0-9 _] {3,18} $ /optimaliseren van de gecombineerde Regex Dit betekent dat het verkorten van de gecombineerde regex. Merk op dat de klasse [a-zA-Z0-9_] wordt afgekort tot \\ w. De geoptimaliseerde regex is: /^ [\\ w] {3,18} $ /Backtracking We hebben gezien hoe alternatieven met de afwisseling metateken overeenkomen, |. Bij het matchen van alternatieven, PHP maakt gebruik van een proces dat bekend staat als backtracking. Ik zal dit illustreren met een voorbeeld.
Denk aan de volgende uitdrukking: preg_match ("/(124 | 123) (46 | 4 | 45) /", "12345") Ik zal uitleggen terugkrabbelen met het uitleggen van de werking van de bovenstaande formule. De volgende stappen wordt uitgelegd hoe PHP lost deze uitdrukking. A. Het begint met het eerste getal het onderwerp string '1'. B. Het probeert het eerste alternatief in de eerste subpatroon '124'. C. Zij ziet het matchen van '1', gevolgd door '2'. Dat is oke. D. Het merkt dat '4' in de reguliere expressie niet in het onderwerp reeks passen '3' - dat is een doodlopende weg.
Dus het krabbelt twee karakters in het onderwerp string en pakt de tweede alternatief in de eerste subpatroon '123'. E. Het past '1', gevolgd door '2', gevolgd door '3'. De eerste subpatroon is voldaan. F. Het beweegt naar de tweede subpatroon en pakt het eerste alternatief '46'. G. Het past de '4' in de subpatroon string. H. echter '6' in de reguliere expressie komt niet overeen met '5' in de subpatroon reeks, dus dat is een doodlopende weg. Het krabbelt een karakter in de subpatroon string en pakt de tweede alternatief in de tweede subpatroon '4'. I. '4' wedstrijden.
De tweede subpatroon tevreden. J. We zijn aan het eind van de reguliere expressie; we zijn klaar! We hebben geëvenaard '1234' van het onderwerp string "12345". Er zijn twee dingen op te merken over dit proces. Ten eerste, het derde alternatief in de tweede subpatroon '45' laat ook een gelijke, maar het proces gestopt voordat het moet het derde alternatief - op een gegeven tekenpositie, meest linkse overwint. Ten tweede, het proces kon een match in het eerste tekenpositie van het subject string '1'.
Als er geen wedstrijden op de eerste positie, zou PHP naar het tweede teken positie '2' en proberen de wedstrijd weer helemaal opnieuw. PHP opgeeft en verklaart "12345" = ~ /(124 | 123) (46 | 4 | 45) /, vals te zijn, wanneer alle mogelijke paden dat mogelijk karakterposities zijn uitgeput. De x Modifier Dit modifier is door de invoering van x in kleine letters net naast de tweede schuine streep van de reguliere expressie ingesteld.
Dat wil zeggen: /patroon /x Als deze modifier is ingesteld, witruimte gegevens tekens in het patroon zijn totaal genegeerd, behalve wanneer ontsnapt of binnen een tekenklasse, en personages tussen een onbeschermde # buiten een karakter klasse en de volgende nieuwe regel karakter, inclusief zijn Ook negeerde. Ik zal dit illustreren. Het zegt witruimte gegevens tekens in het patroon zijn totaal genegeerd, behalve wanneer ontsnapt of binnen een tekenklasse. Beschouw het onderwerp string: $ subject = "Ik ben een man zitten."; De volgende expressie met de x modifier produceert geen een wedstrijd.
preg_match ("/man zitten /x", $ onderwerp) Dit komt omdat in de reguliere expressie, de single-ruimte tussen de "man" en "zitten" en "zitten" en "down" zijn niet herkend, met de aanwezigheid van de x modifier. Als u tegelijkertijd de bijbehorende ruimten in het onderwerp verwijdert u een wedstrijd, met de x modifier hebben. Het volgende onderwerp zal een match te produceren met de bovenstaande reguliere expressie: $ subject = "Ik ben een mansittingdown.
"; Als u wilt dat de oorspronkelijke onderwerp en reguliere expressie aan te passen, dan moet je de ruimten in de reguliere expressie te ontsnappen. De volgende expressie geeft een match met het oorspronkelijke onderwerp: preg_match ("/man \\ zitten \\ omlaag /x", $ onderwerp) Een ontsnapte enkele ruimte is "\\". Laten we nu praten over de witte ruimte in een karakter klasse. Merk op dat witruimte is eigenlijk [\\ \\ t \\ r \\ n \\ f], niet alleen "\\". Maar laten we vervolgen onze illustratie met behulp van "\\".
We maken gebruik van hetzelfde onderwerp, dat wil zeggen: $ subject =; "Ik ben een man zitten." Als we willen de ruimte voor zitten, gevolgd door "zitten", met de x modifier overeenkomen, dan is onze reguliere expressie zou kunnen zijn; /[] Zit /x Merk op dat de spaties in het karakter klasse is niet ontsnapt. Dat wil zeggen, met de x modifier, wordt witruimte binnen een tekenklasse niet ontsnapt, terwijl witruimte buiten het karakter klasse is ontsnapt.
De volgende expressie geeft een match: preg_match ("/[] zit /x", $ onderwerp) Met de x modifier, is alle tekst tussen de # karakter en de impliciete of expliciete nieuwe regel genegeerd. Een impliciete newline karakter wordt bereikt door op de Enter-toets als je aan het typen bent. Een expliciete newline karakter wordt bereikt door het intikken van het \\ n karakter. Beschouw de volgende code: $ subject = "Ik ben een man zitten."; $ re = "/man \\ #Comment gaat hier zit /x"; if (preg_match ($ re, $ subject)) echo "Matched". ".
"? "Anders echo" Niet Matched> Het onderwerp is: $ subject = "Ik ben een man zitten."; De reguliere expressie is: $ re = "/man \\ #Comment gaat hier zit /x"; Let op de aanwezigheid van de # karakter en de impliciete newline karakter, verkregen na het woord, "hier" door op de Enter-toets. Een wedstrijd wordt geproduceerd. De sub-string die eigenlijk afgestemd is "man". In de volgende code, de nieuwe regel karakter is expliciet, met \\ n. Een wedstrijd wordt ook geproduceerd. $ subject = "Ik ben een man zitten.
"; $ re = "/man \\ #Comment gaat hier \\ nsitting /x"; if (preg_match ($ re, $ subject)) echo "Matched". "Else echo" Niet Matched "."?>