*   >> Lese Utdanning Artikler >> tech >> web development

Bygge et vanlig uttrykk i Php

PHP regulære uttrykk - Part VI Innledning Mange av eksemplene vi har kommet over er enkle eksempler. I dette avsnittet ser vi på to eksempler som er mer krevende. Før vi forlater denne delen av serien, skal vi snakke om det som kalles backtracking. Trinnene som kreves for å bygge en Regex Dette er fremgangsmåten som kreves for å bygge en regex: * Angi oppgaven i detalj, * Bryt ned problemet i mindre deler, * Trans små deler inn regexes, * Kombiner regexes, * Optimal den endelige kombinert regexes.

To eksempler Eksempel 1 heksadesimale fargekode Sjekk Spesifisere Task i detalj Et eksempel på en heksadesimal fargekode er # 4C8. Et annet eksempel er # 44CC88. * En heksadesimale koden begynner med en hash, etterfulgt av enten 3 heksadesimale tall eller 6 heksadesimale tall. * Heksadesimale tall er: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E og F. * De heksadesimale bokstaver kan være i små og store bokstaver. Breaking Down problemet i mindre deler * Det begynner med en #.

* Den etterfølges av 3 heksadesimale tall eller * 6 heksadesimale tall * Det er ingen tegn etter 3 eller 6 heksadesimale sifre. Sette til regexes Det er tre små deler ovenfor. Den første delen gir regex: /# /Den andre delen gir regex: /[0-9a-fa-F] {3} /Den tredje delen gir regex: /[0-9a-fa-F] { 6} /Den siste delen gir regex: /$ /Kombinere regexes Dette er den kombinerte regex: /# ([0-9a-fa-F] {3} $) | ([0-9a-FA-F ] {6} $) /Noter alternative metategn, | for de tre eller seks heksadesimale sifre. Legg også merke til parentesene som skiller de alternative gruppene.

Optimalisere Kombinert Regex Dette betyr forkorte kombinert regex. Vær oppmerksom på at 0-9 er forkortet til \\ d. Så i den kombinerte regex, endrer vi to forekomster av 0-9 til \\ d. Den optimaliserte regex er: /# ([\\ da-fa-F] {3} $) | ([\\ da-fa-F] {6} $) /Dette uttrykket er kortere enn de ovennevnte av to tegn. Følgende kode illustrerer dette: $ emne = "# 44CC88"; if (preg_match ("/# ([\\ da-fa-F] {3} $) | ([\\ da-fa-F] {6} $) /", $ emne)) echo "matchet". "Ellers echo" Not Matchet ".

"?> Eksempel 2 Brukernavn Sjekk Spesifisere Task i detalj Anta at vi har et nettsted der brukerne må logge inn. Vi kan fortelle brukeren at hans navn skal inneholde bokstaver i små og store bokstaver og /eller tall fra null til ni og /eller understrek, _. Vi insisterer også på at navnet ikke må være mindre enn 3 tegn eller mer som 18 tegn. I dette eksempelet har vi pålagt de detaljerte spesifikasjoner.

Breaking Down problemet i mindre deler Et påloggingsnavn består av * bokstavene i alfabetet i små og store bokstaver mellom 3 til 18 bokstaver, inkluderende, og /eller * tall fra 0 til 9 mellom 3 til 18 sifre, inkluderende, og /eller * understrek mellom 3 til 18 sifre, inkluderende. Det betyr at du kan ha opp til 18 strek for et navn. La oss tillate at for enkelhet. * Vi må begrense lagt streng til 3 eller 6 tegn.

Sette til regexes Den regex for det første punktet er: /^ [a-za-Z] {3,18} $ /The regex for det andre punktet er: /^ [0-9] {3,18} $ /The regex for det tredje punktet er: /^ [_] {3,18} $ /Det fjerde punktet er iboende i ovennevnte regexes. Kombinere regexes I pausen ned delen, er de ovennevnte tre punkter kombinert med uttrykket "og /eller" Det er ingen direkte måte å gjøre dette, så vi må slutte den. Dette er kombinert regex: /^ [a-za-Z0-9 _] {3,18} $ /Optimalisere Kombinert Regex Dette betyr forkorte kombinert regex. Legg merke til at klassen [a-za-Z0-9_] er forkortet til \\ w.

Den optimaliserte regex er: /^ [\\ w] {3,18} $ /backtracking Vi har sett hvordan å matche alternativer ved hjelp av vekslingen metategn, |. Når matchende alternativer, bruker PHP en prosess som kalles backtracking. Jeg vil illustrere dette med et eksempel. Betrakt det følgende uttrykk: preg_match ("/(124 | 123) (46 | 4 | 45) /", "12345") Jeg vil forklare tilbakesporing av forklare virkemåten av de ovennevnte uttrykk. Følgende trinn forklarer hvordan PHP løser dette uttrykket. A. Det begynner med første nummer i emnestrengen '1'. B.

Den prøver den første alternativ i den første subpattern '124'. C. Det ser matching av '1' etterfulgt av 'to'. Det er ok. D. Det legger merke til at '4' i regex samsvarer ikke '3' i emne streng - som er en blindvei. Så det backtracks to karakterer i faget streng og plukker det andre alternativet i første subpattern '123'. E. Det matcher '1' etterfulgt av 'to' etterfulgt av '3'. Den første subpattern er fornøyd. F. Den beveger seg videre til andre subpattern og plukker det første alternativet '46'. G. Det tilsvarer '4' i subpattern streng. H.

Men '6' i regex samsvarer ikke '5' i subpattern streng, så det er en blindvei. Det backtracks ett tegn i subpattern streng og plukker det andre alternativet i andre subpattern '4'. I. '4' kamper. Den andre subpattern er fornøyd. J. Vi er ved slutten av regex; vi er ferdig! Vi har matchet '1234' ut av faget strengen "12345". Det er to ting å merke seg om denne prosessen. Først lar tredje alternativ i andre subpattern '45' også en kamp, ​​men prosessen stoppet før det kom til et tredje alternativ - på et gitt tegnposisjon, erobringer lengst til venstre.

Dernest var prosessen i stand til å få en kamp på det første tegnet motivets plassering strengen '1'. Hvis det var ingen treff på første posisjon, ville PHP flytte til andre tegnposisjon '2' og forsøke kampen på nytt. PHP gir opp og erklærer "12345" = ~ /(124 | 123) (46 | 4 | 45) /, for å være falsk, bare når alle mulige veier på alle mulige tegn stillinger er uttømt. X Modifier Detaljer Dette modifier er satt ved å sette x små bokstaver rett ved siden av den andre skråstrek av regex.

Det vil si: /mønster /x Hvis denne modifier er satt, blanke data tegn i mønsteret er helt ignorert unntatt når rømt eller inne i en karakter klasse, og karakterer mellom en avkodet # utenfor et tegn klasse og neste linjeskift karakter, inkluderende, er også ignorert. Jeg vil illustrere alt dette. Det står blanke data tegn i mønsteret er helt ignorert unntatt når rømt eller inne i et tegn klasse. Tenk emnet streng: $ emne = "Jeg er en mann som satt ned."; Følgende uttrykk med x modifier produserer ikke en kamp.

preg_match ("/mann sitte ned /x", $ emne) Dette er fordi i regex, er den enkelt mellomrommet mellom "mann" og "sitter" og "sitter" og "ned" ikke gjenkjent, med tilstedeværelse av x modifier. Hvis du fjerner disse tilsvarende områder i faget vil du ha en kamp, ​​med x modifier. Følgende temaer vil produsere en kamp med ovennevnte regex: $ emne = "I am a mansittingdown."; Hvis du vil ha den opprinnelige emnet og regex å matche, så må du unnslippe mellomrom i regex.

Følgende uttrykk produserer en kamp med den opprinnelige emnet: preg_match ("/mann \\ sitter \\ ned /x", $ emne) En rømt enkelt mellomrom er "\\". La oss nå snakke om hvit plass i et tegn klasse. Vær oppmerksom på at mellomrom er faktisk [\\ \\ t \\ r \\ n \\ f], ikke bare "\\". Men la oss fortsette vår illustrasjon bruke "\\". Vi bruker samme emne, er at: $ emne =; "Jeg er en mann som satt ned." Hvis vi ønsker å matche plass foran sittende, etterfulgt av "sitter", med x modifier, da vår regex kan være; /[] Sittende /x Merk at de tomme i tegnklassen ikke er rømt.

Det er, med x modifier, er mellomrom inne i en karakter klasse ikke rømt, mens mellomrom utenfor tegnet klassen er rømt. Følgende uttrykk produserer en kamp: preg_match ("/[] sittende /x", $ emne) Med x modifier, er enhver tekst mellom # karakter og implisitt eller eksplisitt linjeskift karakter ignorert. En implisitt linjeskift karakter oppnås ved å trykke på Enter-tasten når du skriver. En eksplisitt linjeskift karakter oppnås ved å skrive \\ n karakter. Vurdere følgende kode: $ emne = "Jeg er en mann som satt ned.

"; $ re = "/mann \\ #Comment går her sitter /x"; if (preg_match ($ re, $ emne)) echo "matchet". "."? "Ellers echo" Ikke Matchet> Temaet er: $ emne = "Jeg er en mann som satt ned."; Regex er: $ re = "/mann \\ #Comment går her sitter /x"; Legg merke til tilstedeværelsen av # karakter og den implisitte linjeskift karakter, oppnådd etter ordet "her" ved å trykke på Enter-tasten. En konkurranse er produsert. Under strengen som faktisk matchet er "man sitter". I følgende kode, er linjeskift karakter eksplisitt, med \\ n. En kamp er også produsert. $ emne = "Jeg er en mann som satt ned.

"; $ re = "/mann \\ #Comment går her \\ nsitting /x"; if (preg_match ($ re, $ emne)) echo "matchet". "Ellers echo" Not Matchet "."?>

Page   <<       [1] [2] [3] [4] >>
Copyright © 2008 - 2016 Lese Utdanning Artikler,https://utdanning.nmjjxx.com All rights reserved.