*   >> läser Utbildning artiklar >> tech >> web development

Att bygga ett reguljärt uttryck i Php

PHP Regular Expressions - Del VI Inledning Många av de exempel vi har stött på är enkla exempel. I det här avsnittet tittar vi på två exempel som är mer krävande. Innan vi lämnar den här delen av serien, ska vi prata om vad som kallas backtracking. Steg som krävs för att bygga en Regex Dessa är de åtgärder som krävs för att bygga ett reguljärt uttryck: * Ange uppgiften i detalj * Bryt ner problemet i mindre delar, * Översätt små delar i regexes, * Kombinera regexes, * Optimera den slutliga kombinerade regexes.

Två Exempel Exempel 1 Hexadecimal Färgkod Kontrollera Ange uppgift i detalj Ett exempel på en hexadecimal färgkod är # 4C8. Ett annat exempel är # 44CC88. * En hexadecimal kod börjar med en hash, följt av antingen 3 hexadecimala tal eller 6 hexadecimala tal. * Hexadecimala siffror är: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, och F. * De hexadecimala bokstäver kan vara i lägre eller versaler. Att bryta ner problemet i mindre delar * Det börjar med en #. * Det följs av 3 hexadecimala tal eller * 6 hexadecimala tal * Det finns inget tecken efter 3 eller 6 hexadecimala siffror.

Översätta in regexes Det finns tre små delar ovan. Den första delen ger regex: /^ # /Den andra delen ger regex: /[0-9a-fa-F] {3} /Den tredje delen ger regex: /[0-9a-fa-F] { 6} /Den sista delen ger regex: /$ /Kombinera regexes Detta den kombinerade regex: /^ # ([0-9a-fa-F] {3} $) | ([0-9a-fa-F ] {6} $) /noterar den alternativa metatecken, | för de tre eller sex hexadecimala siffror. Observera också parentesen som skiljer de alternativa grupper. Optimera Kombinerade Regex Detta innebär att förkorta den kombinerade regex. Lägg märke till att 0-9 förkortas \\ d.

Så i den kombinerade regex, ändrar vi de två förekomster av 0-9 \\ d. Den optimerade regex är: /^ # ([\\ da-fa-F] {3} $) | ([\\ da-fa-F] {6} $) /Detta uttryck är kortare än ovan av två tecken. Följande kod visar detta: $ Ämne = "# 44CC88"; if (preg_match ("/^ # ([\\ da-fa-F] {3} $) | ([\\ da-fa-F] {6} $) /" $ ämne)) echo "Matchade". "Annars echo" Inte Matchade "."?> Exempel 2 Användarnamn Kontrollera Ange uppgift i detalj Antag att vi har en webbplats där användare måste logga in.

Vi kan tala om för användaren att hans namn ska innehålla bokstäverna i lägre eller versaler och /eller siffror från noll till 9 och /eller understreck, _. Vi insisterar också att namnet inte får vara kortare än 3 tecken eller större än 18 tecken. I det här exemplet har vi ålagts specifikationsuppgifter. Att bryta ner problemet i mindre delar ett inloggningsnamn består av * bokstäverna i alfabetet i lägre eller versaler mellan 3 till 18 bokstäver, inklusive, och /eller * siffror från 0 till 9 mellan 3 till 18 siffror, inklusive, och /eller * understreck mellan 3 till 18 siffror, inklusive.

Detta innebär att du kan ha upp till 18 streck för ett namn. Låt oss tillåta att för enkelhets skull. * Vi måste begränsa ämnet strängen till 3 eller 6 tecken. Översätta in regexes Den regex för den första punkten är: /^ [a-zA-Z] {3,18} $ /Den regex för den andra punkten är: /^ [0-9] {3,18} $ /The regex för den tredje punkten är: /^ [_] {3,18} $ /Den fjärde punkten är inneboende i ovanstående regexes. Kombinera regexes I bryta ner avsnittet är de ovanstående tre punkter i kombination med frasen "och /eller" Det finns inget direkt sätt att göra detta, så vi måste sluta det.

Detta är den kombinerade regex: /^ [a-zA-Z0-9 _] {3,18} $ /Optimera Kombinerade Regex Detta innebär att förkorta den kombinerade regex. Lägg märke till att klassen [a-zA-Z0-9_] förkortas \\ w. Den optimerade regex är: /^ [\\ w] {3,18} $ /Backtracking Vi har sett hur man matcha alternativ med hjälp av växlingen metatecken, |. När matchande alternativ, använder PHP en process som kallas backtracking. Jag kommer att illustrera detta med ett exempel.

Tänk på följande uttryck: preg_match ("/(124 | 123) (46 | 4 | 45) /", "12345") Jag kommer att förklara backa genom att förklara driften av ovanstående uttryck. Följande steg förklarar hur PHP löser detta uttryck. A. Det börjar med den första siffran i ämnessträngen '1'. B. Det försöker det första alternativet i den första delmönster "124". C. Den ser matchningen av "1" följt av "2". Det är okej. D. Det märker att "4" i regex matchar inte "3" i ämnessträngen - som är en återvändsgränd. Så det backtracks två tecken i ämnet strängen och plockar det andra alternativet i första delmönster "123". E.

Den matchar "1" följt av "2" följt av "3". Den första delmönster är uppfyllt. F. Den går vidare till den andra delmönster och plockar det första alternativet "46". G. Det matchar "4" i delmönster strängen. H. Men "6" i det reguljära uttrycket matchar inte "5" i delmönster strängen, så det är en återvändsgränd. Det backtracks ett tecken i delmönster strängen och plockar det andra alternativet i den andra delmönster "4". I. "4" matcher. Den andra delmönster är uppfyllt. J. Vi är i slutet av regex; vi är klara! Vi har matchat '1234' ur ämnet strängen "12345".

Det finns två saker att notera om den här processen. Först, det tredje alternativet i den andra delmönster "45" ger också en match, men processen stoppas innan det kom till det tredje alternativet - vid en given teckenposition, erövrar längst till vänster. För det andra processen kunde få en match på första teckenpositionen av motivet strängen '1'. Om det inte fanns några matcher på den första positionen, skulle PHP flytta till andra teckenposition "2" och försök matchen om igen.

PHP ger upp och förklarar "12345" = ~ /(124 | 123) (46 | 4 | 45) /för att vara falsk, först när alla möjliga vägar på alla möjliga teckenpositioner har uttömts. X Modifier Detaljer modifierings ställs in genom att sätta x i gemener precis bredvid andra snedstreck på regex. Det är: /mönster /x Om modifierings är inställd, blankdatatecken i mönstret är helt ignoreras utom när rymt eller inuti en teckenklass och tecken mellan ett okodat # utanför en teckenklass och nästa nyradstecken, inkluderande, är även ignoreras. Jag kommer att illustrera allt detta.

Den säger blankdatatecken i mönstret är helt ignoreras utom när rymt eller inuti en teckenklass. Tänk på ämnet sträng: $ Ämne = "Jag är en man som satt ner."; Följande uttryck med x modifierings inte producera en match. preg_match ("/man sitter ner /x", $ ämne) Detta beror på det reguljära uttrycket, är det enda utrymmet mellan "man" och "sitter" och "sitter" och "ned" inte erkänns, med närvaro av x modifierare. Om du tar bort dessa motsvarande utrymmen i ämnet kommer du att ha en match med x modifierings.

Följande ämne kommer att producera en match med ovanstående regex: $ Ämne = "Jag är en mansittingdown."; Om du vill ha det ursprungliga ämnet och regex att matcha, då måste man fly utrymmen i regex. Följande uttryck producerar en match med det ursprungliga ämnet: preg_match ("/man \\ sitter \\ ner /x", $ ämne) En flydde enda blanksteg är "\\". Låt oss nu tala om vitt utrymme i en teckenklass. Observera att mellanslag är faktiskt [\\ \\ t \\ r \\ n \\ f], inte bara "\\". Men låt oss fortsätta vår illustration med "\\". Vi använder samma ämne, är att: $ Ämne =, "Jag är en man som satt ner.

" Om vi ​​vill matcha utrymmet framför sammanträde, följt av "sitter", med x modifierings, då vår regex kan vara; /[] Sitter /x Observera att blank i teckenklassen inte har rymt. Det är, med x modifierings är blank inuti en teckenklass inte undgått, medan blank utanför teckenklassen kom undan. Följande uttryck producerar en match: preg_match ("/[] sitter /x", $ ämne) Med x modifierings är någon text mellan # karaktär och implicit eller explicit nyradstecken ignoreras. En implicit radmatningstecken uppnås genom att trycka på Enter när du skriver.

En uttrycklig radmatningstecken uppnås genom att skriva \\ n karaktär. Tänk på följande kod: $ Ämne = "Jag är en man som satt ner."; $ re = "/man \\ #Comment går här sitter /x"; if (preg_match ($ re, $ ämne)) echo "Matchade". "."? "Annat echo" inte motsvaras> Ämnet är: $ Ämne = "Jag är en man som satt ner."; Regex är: $ re = "/man \\ #Comment går här sitter /x"; Notera förekomsten av # karaktär och den implicita nyradstecken, som erhållits efter ordet "här" genom att trycka på Enter. En match produceras. Under sträng som faktiskt matchas är "man sitter".

I följande kod, är radmatningstecknet explicit, med \\ n. En match är också produceras. $ Ämne = "Jag är en man som satt ner."; $ re = "/man \\ #Comment går här \\ nsitting /x"; if (preg_match ($ re, $ ämne)) echo "Matchade". "Annars echo" Inte Matchade "."?>

Page   <<       [1] [2] [3] [4] >>
Copyright © 2008 - 2016 läser Utbildning artiklar,https://utbildning.nmjjxx.com All rights reserved.