Reguljära uttryck php eller. Reguljära uttryck (mönster)

Den vanligaste användningen av reguljära uttryck i Perl är i sök- och ersätt-operatorer som t.ex s //, m /, operatörer av paketet =~ eller != etc. Som regel har alla dessa operatörer liknande alternativ som:

Dessa alternativ kallas vanligtvis "/ x". De kan användas även inuti mallar med den nya konstruktionen (? ...)

Reguljära uttryck eller mönster är samma som Unix regexp-procedurer. Uttryck och syntax är lånade från Henry Spencers V8 Free Routines och finns detaljerade där.

Mallar använder följande metatecken (tecken som representerar grupper av andra tecken), ofta kallade egrep-standarden:

Metatecken har modifierare (skrivna efter metatecken):

I alla andra fall tandställning anses vara vanliga (vanliga) tecken. Således är "*" ekvivalent med (0,), "+" - (1,) och "?" - (0,1). n och m får inte vara större än 65536.

Som standard är metatecken giriga. Matchningen sprids så många gånger som möjligt, utan hänsyn till effekten av följande metakaraktärer. Om du vill "minska deras aptit" använd symbolen "?". Detta ändrar inte betydelsen av metakaraktärerna, det minskar bara spridningen. Således:

Mallar fungerar på samma sätt som dubbla citattecken, så du kan använda `\` - tecken (omvänt snedstreck) i dem:

\t - tabbtecken
\ n - ny linje
\r - en vagnretur
\a - formatöversättning
\ v - vertikal flik
\ a - ring upp
\ e - fly
\033 - oktal notation av en karaktär
\x1A - hexadecimal
\ c [ - kontrollkaraktär
\ l - gemener för nästa tecken
\u - versaler -//-
\L - alla gemener upp till \ E
\U - på toppen - // -
\ E - registerändringsbegränsare
\ Q - avbryta en åtgärd som en metakaraktär

Dessutom har följande metatecken lagts till i Perl:

Observera att allt detta är "ett" tecken. Använd modifierare för att indikera sekvensen. Så:

Dessutom finns det imaginära metakaraktärer. Ange icke-existerande tecken vid den punkt där värdet har ändrats. Till exempel:

En ordgräns (\ b) är den imaginära punkten mellan \ w och \ W tecknen. Inom en teckenklass anger "\ b" ett backstegstecken. Metakaraktärer \A och \ Z- liknande "^" och "$", men om början av raden "^" och slutet av raden "$" är giltiga för varje rad på en rad med flera rader, \A och \ Z beteckna början och slutet av en hel flerradssträng.

Om en gruppering ( runda fästen), så betecknas gruppundersträngens nummer som "\ siffra". Observera att bakom ett mönster inom ett uttryck eller block, kallas dessa grupper för "$-siffra". Dessutom finns det ytterligare variabler:

Exempel:

$ s = "En 1 Två 2 och Tre 3"; if ($ s = ~ / (\ d +) \ D + (\ d +) /) (skriv ut "$ 1 \ n"; # Resultat "1" skriv ut "$ 2 \ n"; # "2" skriv ut " $ + \ n" ; # "2" skriver ut "$ & \ n"; # "1 två 2" skriver ut "$` \ n "; #" En "utskrift" $ "\ n"; # "och tre 3" )

Perl version 5 innehåller ytterligare mallkonstruktioner:

Exempel:

$ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (? = -) /) # Hitta siffran bakom "-" (skriv ut "$ 1 \ n"; # Resultat "2") annars (skriv ut "sökfel \ n" ;)

(?! mönster) - se framåt genom negation:

Exempel:

$ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (?! \ +) /) # Hitta en siffra som inte följs av "+" (skriv ut "$ 1 \ n"; # Resultat "2") annars (skriv ut " sökfel \ n ";)

(? ismx) - "interna" modifierare. Det är bekvämt att använda i mallar, där du till exempel behöver ange en modifierare inuti mallen.

Regler för reguljära uttryck. (regex)

  1. Vilken karaktär som helst står för sig själv, såvida det inte är en metakaraktär. Om du behöver ångra en metatecken, föregå den med "\".
  2. En teckensträng betecknar en sträng av dessa tecken.
  3. Uppsättningen av möjliga tecken (klass) är hakparentes"", betyder det att ett av tecknen som anges inom parentes kan finnas på denna plats. Om det första tecknet inom parentes är "^" - så kan inget av de angivna tecknen visas på denna plats i uttrycket. Inuti en klass kan du använda tecknet "-" för att indikera ett antal tecken. Till exempel är a-z en av de små bokstäverna i det latinska alfabetet, 0-9 är en siffra osv.
  4. PHP-portalforum. SU

) Jag visade dig ett exempel på användning vanliga uttryck att hitta vissa bitar källkod sidor. Nu ska vi lära oss hur man skriver dem själva. Denna färdighet hjälper dig att skriva, rensa text från onödiga fragment, söka efter de nödvändiga delarna i stora volymer text och så vidare.

Det här ämnet är ganska knepigt, men jag ska försöka kortform lyser upp mest viktiga punkter... Jag vet inte hur mycket jag kan göra det, men jag hoppas att lektionen kommer att vara användbar.
Så till att börja med finns det flera funktioner för att arbeta med reguljära uttryck i PHP, men tre används oftast:

  • preg_replace - sök och ersätt text som matchar det reguljära uttrycket;
  • preg_match - bara vanlig sökning;
  • preg_split - sök och dela text.

Förbi åtminstone, i de tidigare lektionerna använde vi dem. I stället för preg_match fanns det preg_match_all, men detta är i huvudsak samma sak, bara det senare avbryter inte sökningen efter det första fyndet. Det vill säga om vi använder preg_match kommer vi inte att hitta alla förekomster, utan bara den första.

Valet i vilken situation man ska använda vilken funktion är ganska enkelt. Vi måste ersätta - vi använder ersätt, som i fallet när vi behövde ta bort onödiga delar av sidkoden, minns du?

$ page = preg_replace ("/ ^] / i "," ", $ page); $ page = preg_replace (" / ^] / i "," ", $ page); $ page = str_replace (""," ", $ sida);

Funktionens första parameter är ett regex, som bestämmer vad vi letar efter. Det andra är vad vi ersätter. För det tredje - Vart vi letar. Därför tog vi här variabeln $ page och tilldelade resultatet av preg_replace-funktionen till den, där vi sökte efter alla input type = kryssrutor, samt öppnande och avslutande etiketter. Ersatte dem med ", det vill säga de tog helt enkelt bort dem. Jag hoppas att allt är klart här. Vi kommer att gå vidare till analysen av själva uttrycket (funktionens första parameter) lite senare.
Det fanns också ett exempel på att använda preg_match_all, vilket var praktiskt för att hitta alla länkar i resten av texten. Vi behövde då länkar eftersom det var i dem det nyckelord som vi analyserade. Här är vad som hände:

Preg_match_all ("/ ]+?>(.*?)<\/a>/ uis ", $ sida, $ ok); för ($ j = 0; $ j ". $ ok [$ j].""; }

Den första parametern, återigen, är den vanliga, för att hitta alla länkar, som naturligt är inneslutna i "a"-taggen (om du inte är vänlig med HTML-kodning, läs den då). Den andra är en variabel som innehåller texten med vilken sökningen kommer att ske. Den tredje parametern är en variabel, i vilken resultatet placeras - $ ok. Efter det återstår bara att gå igenom alla nödvändiga $ ok element för att få de nyckelfiskar vi behöver. Separat måste det sägas att vid utgången får vi en flerdimensionell array. Det är därför vi matar ut det på ett så komplicerat sätt: $ ok [$ j]. För att se strukturen på arrayen, använd funktionen nedan så förstår du allt.

Print_r ($ ok);

Här verkar det som att vi har listat ut funktionerna som vi använde för arbetet. Nu återstår bara att lära sig hur man skriver dessa mycket reguljära uttryck, som är den första parametern för var och en av dessa metoder. Låt oss gå vidare till det viktigaste.

Hur man skriver stamgäster

Låt oss först ta en titt på de grundläggande konstruktionerna. Uttryck har alternativ. De anges med en bokstav och skrivs i slutet, föregås av ett snedstreck.

Dessutom stöds följande metatecken:

Metatecken kan i sin tur ha modifierare:

Nåväl, nu kan vi gå vidare till analysen av våra stammisar från förra lektionen. Baserat på tabletterna ovan, låt oss försöka förstå vad vi har. Här är uttrycket:

/^] / i

Det första och sista snedstrecket "/" indikerar att det finns ett reguljärt uttryck inuti dem. Samtidigt, efter den sista, sätter vi "i", detta är ett alternativ, som i den första tabellen - inte skiftlägeskänsligt. Innanför snedstreck, själva den vanliga linjen. Det börjar med ett mindre än-tecken och en input-tagg, och allt som följer tills punkttecknet, vilket är enkel text att leta efter. Men själva punkten och symbolerna efter den - det här är redan mer intressant. I det här fallet, konstruktionen ". *?" betyder vilken sekvens av tecken som helst. Det vill säga, om du kombinerar bara texten och den givna konstruktionen, kommer vi att markera all text efter den första förekomsten till slutet. För att sluta måste du uppfylla antingen den avslutande HTML-taggen "större än" eller nyradstecknet. Denna design ger oss bara denna möjlighet:

Symboler inom hakparenteser är så att säga förbundna med ett logiskt ELLER. Slutet är ett större än-tecken ELLER början på en rad.
Det är hela uttrycket, i det sätter vi startvillkoret, mitt- och slutvillkoret. Inte svårt, eller hur? Här är en illustration för tydlighetens skull:

Låt oss bryta ner en till för att stelna allt. Vi sökte efter dem för länkar:

/]+?>(.*?)<\/a>/ uis

Vi läser uttrycket. Återigen, kassera snedstreck och alternativ först. "uis"-flaggor är förståeliga, förutom "u" som jag inte beskrev - det indikerar att vi använder Unicode-kodning. Inte mycket återstår. Starten är "a"-taggen, som öppnas, sedan kommer klassen

vilket betyder INTE mer eller mindre (öppnande och stängande html-taggar), det vill säga några tecken i detta fall. "+?" läggs till i klassen, vilket betyder att den här klassen kommer att vara närvarande 1 eller flera gånger (men minst 1 gång säkert). Och sedan kommer den avslutande HTML-taggen för "a"-taggen. Det finns text inuti länken, som ställs in av gruppen

Vi vet trots allt inte vilken typ av text som kommer att finnas där, så vi definierar en sådan grupp. Och i slutet, den avslutande taggen "a":

Observera att vi undviker snedstrecket med ett omvänt snedstreck så att det uppfattas som vanlig text.

Fuh. Ämnet är egentligen ganska komplext, det kräver övning. Jag kanske inte gör något helt optimalt och du kan skapa andra mer korrekta reguljära uttryck, men jag är samma självlärda person som du, så döm inte strikt utan dela hellre dina alternativ i kommentarerna. Dessutom, om något inte är klart - kommentarer och en kontaktsida står till din tjänst.

Reguljära uttryck är speciella mönster för att hitta en delsträng i text. Med deras hjälp kan du lösa följande uppgifter på en rad: "kontrollera om strängen innehåller siffror", "hitta alla e-postadresser i texten", "ersätt flera på varandra följande frågetecken med ett".

Låt oss börja med en populär programmeringsvisdom:

Vissa människor, när de står inför ett problem, tänker: "Ja, jag är smart, jag löser det med vanliga uttryck." Nu har de två problem.

Exempel mallar

Låt oss börja med ett par enkla exempel. Det första uttrycket i bilden nedan letar efter en sekvens av 3 bokstäver, där den första bokstaven är "k", den andra är en rysk bokstav och den tredje är "t" okänslig för skiftlägen (till exempel "katt" eller "KATT" matchar detta mönster). Det andra uttrycket letar efter tiden i texten i formatet 12:34.

Alla uttryck börjar med ett avgränsningstecken. Symbolen / används vanligtvis som den, men du kan också använda andra symboler som inte har något speciellt syfte i vanliga mönster, till exempel ~, # eller @. Alternativa avgränsare används om / kan förekomma i uttrycket. Sedan kommer mönstret på strängen vi letar efter, följt av en andra avgränsare, och i slutet kan det finnas en eller flera flaggbokstäver. De ger ytterligare alternativ när du söker efter text. Här är några exempel på flaggor:

  • i - säger att sökningen ska vara skiftlägesokänslig (skiftlägeskänslig som standard)
  • u - säger att uttrycket och texten som söks använder utf-8-kodning, inte bara latinska bokstäver. Utan det kanske sökningen efter ryska (och alla andra icke-latinska) tecken inte fungerar korrekt, så du bör alltid använda den.

Själva mallen består av vanliga symboler och speciella konstruktioner. Tja, till exempel bokstaven "k" på vanliga rader betyder sig själv, men symbolerna betyder "på den här platsen kan det finnas valfritt tal från 0 till 5". Här är en komplett lista över specialtecken (de kallas metatecken i php-manualen), och alla andra tecken i regexet är normala:

Nedan kommer vi att analysera innebörden av var och en av dessa symboler (och även förklara varför bokstaven "ё" återges separat i det första uttrycket), men låt oss nu försöka tillämpa våra reguljära uttryck på texten och se vad som händer. Php har en speciell funktion preg_match ($ regexp, $ text, $ match) som tar ett vanligt mönster, en text och en tom array som indata. Den kontrollerar om texten innehåller en delsträng som matchar det givna mönstret och returnerar 0 om inte, eller 1 om det finns en. Och i den passerade arrayen i elementet med index 0, sätts den första hittade matchningen med regexet. Låt oss skriva ett enkelt program som tillämpar reguljära uttryck på olika strängar:

Efter att ha läst exemplet, låt oss utforska reguljära uttryck mer i detalj.

Parenteser inom reguljära uttryck

Låt oss upprepa vad de olika typerna av parentes betyder:

  • De lockiga klammerparenteserna a (1,5) anger antalet repetitioner av föregående tecken - i det här exemplet söker uttrycket efter 1 till 5 på varandra följande bokstäver "a"
  • Hakparenteserna betyder "någon av dessa tecken", i det här fallet bokstäverna a, b, c, x, y, z eller en siffra från 0 till 5. Andra specialtecken som | eller * - de representerar en vanlig karaktär. Om symbolen ^ står i början av hakparenteserna, är betydelsen omvänd: "vilket som helst tecken, utom de angivna" - till exempel betyder [^ a-c] "vilket som helst tecken utom a, b eller c".
  • Parentes grupperar tecken och uttryck. Till exempel, i uttrycket abc hänvisar + plustecknet endast till bokstaven c och detta uttryck letar efter ord som abc, abcc, abccc. Och om du sätter parenteserna a (bc) + så hänvisar kvantifieraren plus till sekvensen bc och uttrycket letar efter orden abc, abcbc, abcbcbc

Notera: inom hakparenteser kan du ange teckenintervall, men kom ihåg att den ryska bokstaven ё går separat från alfabetet och för att skriva "alla ryska bokstäver" måste du skriva [a-yayo].

Bexsles

Om du har tittat på andra självstudier för regex, har du förmodligen märkt att omvänt snedstreck skrivs olika överallt. Någonstans skriver de ett snedstreck: \ d, men här i exemplen upprepas det 2 gånger: \\ d. Varför?

Det reguljära uttrycksspråket kräver att du skriver omvänt snedstreck en gång. Men i enkla och dubbla citerade strängar i PHP har backslash också en speciell betydelse: manualen om strängar. Tja, till exempel, om du skriver $ x = "\ $"; då kommer PHP att tolka detta som en speciell kombination och bara infoga $-tecknet i strängen (och regex-motorn kommer inte att känna till omvänt snedstreck innan det). För att infoga sekvensen \ $ i en sträng måste vi dubbla snedstrecket och skriva koden som $ x = "\\ $"; ...

Av denna anledning måste vi i vissa fall (där en teckensekvens har speciell betydelse i PHP) dubbla omvänt snedstreck:

  • För att skriva \ $ i regexet, skriver vi i koden "\\ $"
  • För att skriva \\ i det regex, dubblar vi varje snedstreck och skriver "\\\\"
  • För att skriva ett snedstreck och ett nummer (\ 1) i det vanliga rutnätet måste snedstrecket dubbleras: "\\ 1"

I andra fall kommer ett eller två snedstreck att ge samma resultat: "\\ d" och "\ d" kommer att infoga ett par \d tecken i strängen - i det första fallet är 2 snedstreck en sekvens för att infoga ett omvänt snedstreck, i det andra fallet finns det ingen speciell sekvens och tecken kommer att infogas som de är. Du kan kontrollera vilka tecken som infogas i strängen och vad regexmotorn ser med echo: echo "\ $"; ... Ja, det är svårt, men vad kan man göra?

Specialkonstruktioner i vanliga

  • \ d söker efter valfri siffra, \ D - vilket tecken som helst utom en siffra
  • \ w matchar valfri bokstav (valfritt alfabet), siffra eller understreck _. \ W matchar alla tecken utom bokstav, siffra, understreck.

Det finns också ett bekvämt villkor för att ange en ordgräns: \ b. Denna konstruktion innebär att det på ena sidan av den måste finnas ett tecken som är en bokstav / siffra / understreck (\ w), och på andra sidan är det inte det. Jo, till exempel vill vi hitta ordet "katt" i texten. Om vi ​​skriver regex / katt / ui, kommer den att hitta sekvensen av dessa bokstäver var som helst - till exempel inuti ordet "boskap". Det här är helt klart inte vad vi ville. Om vi ​​lägger till ordet gränsvillkor till det regex: / \ bcat \ b / ui, så kommer nu bara det separata ordet "katt" att sökas.

Manuell

  • PHP reguljära uttryckssyntax, detaljerad beskrivning

Reguljära uttryck är ett mycket kraftfullt, men samtidigt svårt att förstå, strängbearbetningsverktyg. Jag kommer att beskriva huvudpunkterna. Ett reguljärt uttryck är ett strängmönster. Med det här mönstret kan du söka efter förekomster, göra ersättningar, kontrollera mönstermatchning.

Regler för mönsterkomponering

Mallens gränser bör indikeras med vissa symboler, använder ofta " / "men jag föredrar att använda" # "eftersom överflödet av snedstreck framåt/bakåt kan få dina ögon att se hemska ut, och" galler "används vanligtvis inte någon annanstans. Så:" #RegularExpressionBody #"

Inuti det reguljära uttrycket används parenteser - dessa är underuttryck som kan manipuleras, till exempel:

# ^ / katalog / (+) / (+) \. html. * #

Detta uttryck är till för att hämta parametrar i en sträng URL... I början av raden finns ett specialtecken " ^ "- detta betyder början på en rad. Nästa kommer" / katalog /"- det finns inga specialtecken, det här är bara text som ska finnas i strängen. Sedan mötte de parenteser, det vill säga de nådde det första underuttrycket. Hakparenteser anger uppsättningen tecken som kan finnas i strängen på denna plats . Skylt" - "betyder uppräkning. Tecken" \ "slipper specialtecken. Således kan vi i det första underuttrycket ha STORA och små bokstäver i det latinska alfabetet, siffror från 0 till 9, understreck, bindestreck och punkt. Bindestreck och punkt är specialtecken, men här är de escaped, så här är det bara symboler. Efter hakparenteserna finns en " + "- detta betyder att det föregående tecknet (och vi har denna uppsättning tecken inom hakparenteser) kan gå 1 eller flera gånger. Sedan kommer" / "är bara en karaktär och ett liknande andra underuttryck. Sedan kommer" \ .html"som betyder text" .html". Och så specialtecken" .* "punkt betyder valfritt tecken, och en asterisk betyder valfritt antal av föregående tecken. Det vill säga efter" .html"allt kan gå.

Kvantitetsindikering, kvantifierare

Ovan har vi redan övervägt sådana tecken som anger antalet tidigare tecken, som t.ex + och * ... Här är alla möjligheter för att ange kvantitet:

Speciella karaktärer

Det finns speciella förkortningar för vissa grupper av tecken:

"Girighet"

Låt oss ta en titt på begreppet regex girighet. Det finns till exempel en rad:

#()#

Vi läser: underuttryck:

Om allt stämmer matchar underuttrycket:

Men det passar också:

Vi kommer att få det, eftersom reguljära uttryck är giriga som standard. Du kan ta bort girighet med modifieraren " U", så här:

#() #U

Modifierare

Det reguljära uttrycket kan följas av modifierare: " #ThereRegularExpressionBody #ThatModifiers"Typer av modifierare:

i Slår på skiftlägeskänsligt läge, dvs. versaler och små bokstäver skiljer sig inte åt i uttrycket.
m Indikerar att texten som genomsöks ska behandlas som flera rader. Som standard behandlar motorn för reguljära uttryck text som en enda sträng, oavsett vad den egentligen är. Följaktligen metakaraktärerna "^" och "$" ange början och slutet av hela texten. Om denna modifierare anges, kommer de att peka på början respektive slutet av varje textrad.
s Standard metatecken " . "inkluderar inte ett radmatningstecken i definitionen. Om du anger denna modifierare tas den här begränsningen bort.
U Tar bort girigheten från det regex
u Möjliggör reguljära uttryck att arbeta med Kyrillisk till UTF-8, annars fungerar det inte korrekt.

php Funktioner för att arbeta med reguljära uttryck

preg_replace

Hitta och ersätta:

Preg_replace (blandat $-mönster, blandat $-ersättning, blandat $-ämne [, int $-gräns = -1 [, int & $-antal]]);

Varje värde kan vara en sträng eller en array, i fall $ ämne array - en array returneras, annars en sträng

preg_split

Delar en sträng med reguljärt uttryck:

Preg_split (sträng $ mönster, sträng $ ämne [, int $ limit = -1 [, int $ flaggor = 0]]);

Returnerar en array av delsträngar av den givna strängen ämne som bryts ner längs gränserna som matchar mönstret mönster.


En av de mycket kraftfulla och användbara funktionerna i PHP-språket är dess stöd för reguljära uttryck. Många programmerare, både nybörjare och ganska erfarna, skrämmas av den yttre komplexiteten och förvirringen i det reguljära uttrycksspråket. Men jag kan försäkra dig - det är värt det. Användningen av reguljära uttryck underlättar avsevärt arbetet med att bearbeta text och dåligt strukturerad data.


Reguljära uttryck är uttryck skrivna på ett speciellt språk. Var inte orolig, språket är enkelt nog att förstå, bara erfarenhet och övning behövs.


Jag tror att du gång på gång har stött på situationer när du har text (till exempel i Microsoft Word) och du behöver hitta något viktigt i den. Om du vet exakt vad du letar efter är allt enkelt: de ringde upp sökdialogrutan, skrev in önskat ord, tryckte på knappen och voila - texten hittades.


Men vad gör du om du bara i förväg vet vilken typ av information du letar efter? Till exempel är din uppgift att hitta alla e-postadresser i ett par hundra ark dokument. Vissa kommer att bläddra i dokumentet manuellt, andra kommer att söka efter en hund (@) och söka efter den. Håller med - båda varianterna är hårt arbete, otacksamt arbete.

Det är här reguljära uttryck kommer till undsättning. I viss approximation kan reguljära uttryck jämföras med masker eller mönster som är överlagrade på texten: om texten matchar masken är detta det önskade fragmentet. Men innan vi tittar på användningen av reguljära uttryck ska vi ta en titt på deras syntax.

Ett reguljärt uttryck är en textsträng som är sammansatt enligt vissa lagar och regler. En sträng består av tecken och teckengrupper, metatecken, kvantifierare och modifierare.

I det här fallet är symboler alla symboler i vilket alfabet som helst. Och inte bara läsbara. Du kan enkelt infoga ett oläsligt tecken i ett uttryck, för detta behöver du bara känna till dess kod i hexadecimal form. Till exempel:

// läsbara tecken a Е // oläsbara tecken och koder \ x41 - samma som bokstaven "A" \ x09 - tabelltecken

En teckengrupp är en serie tecken skrivna i följd:

Abvg ACZms

Jag uppmärksammar dig direkt - "utrymmet" i reguljära uttryck anses också vara en betydande karaktär, så var försiktig när du skriver uttryck. Till exempel, dessa tecken grappa är OLIKA uttryck:

ABVGDE ABC VAR

Nästa språkelement är metatecken. Prefixet "meta" betyder att dessa symboler beskriver några andra symboler eller deras grupper. Tabellen visar huvudmetakaraktärerna i det reguljära uttrycksspråket:

Metatecken för att specificera specialtecken
() Fästen. Definiera kapslade uttryck.
| Urvalsmetatecken
^ Metatecken i början av raden
$ End of line metatecken
\ n Radmatningstecken (hex 0x0A)
\r Vagnretur (hex 0x0D)
\t Tab-tecken (hex 0x09)
\xhh Infoga tecken med hexadecimal kod 0xhh, till exempel \ x42 kommer att infoga den latinska bokstaven "B"
Metatecken för att specificera grupper av tecken
. Punkt. Vilken karaktär som helst.
\d Siffra (0-9)
\D Inte en siffra (något annat tecken än tecknen 0-9)
\ s Tomt tecken (vanligtvis mellanslag och tabbtecken)
\S Icke-tomt tecken (allt utom tecken som definieras av metatecken \ s)
\ w Ett "ordbok"-tecken (ett tecken som används i ord. Vanligtvis alla bokstäver, alla siffror och ett understreck ("_"))
\W Allt utom de tecken som anges av metatecken \ w

Metatecken från andra halvan av tabellen är mycket lätta att komma ihåg. "d" är siffra (siffra), "s" är symbol (symbol), "w" är ord (ord). Om bokstaven är stor måste du lägga till "NOT" i gruppbeskrivningen.

Låt oss till exempel ta texten "Den röda tröjan har nummer 1812, och den gröna tröjan är 2009". Låt oss titta på exempel på de enklaste reguljära uttrycken:

\ d \ d \ d \ d - hittar 1812 och 2009 \ D - hittar alla bokstäver, mellanslag och skiljetecken \ s - hittar alla mellanslag i texten.

Men trots allt kan året i vårt exempel inte skrivas med fyra, utan med två siffror, ord kan ha andra deklinationer, etc. Delmängder av tecken, som anges med hakparenteser, kan hjälpa till här:

Betyder vilken siffra som helst (samma som \ d) - betyder en jämn siffra - betecknar vilket tecken som helst i det latinska alfabetet (i alla fall) eller siffra.

Till exempel kommer uttrycket \ d \ d \ d i testraden bara hitta 1812, men inte 2009. Detta uttryck ska läsas som "hitta alla fyrsiffriga sekvenser där den sista siffran är 0,2,4,6 eller 8".

Vi måste bara nämna kvantifierare och modifierare.

Kvantifierareär en speciell konstruktion som bestämmer hur många gånger en karaktär eller grupp av tecken ska visas. Kvantifieraren är innesluten i hängslen "()". Det finns två inspelningsformat: exakt och omfång. Exakt formatet är skrivet så här:

Här är X antalet gånger föregående tecken eller grupp måste upprepas. Till exempel uttrycket

Den andra formen av notation är räckvidd. Skrivet som

(X, Y) // eller (, Y) // eller (X,)

där X är minimum och Y är maximalt antal repetitioner. Till exempel:

läses som "två till fyra på varandra följande siffror". Om en av gränserna inte är specificerad, innebär det ingen begränsning. Till exempel:

\ w (3,) - tre eller fler bokstäver. \ d (, 5) - det finns inga siffror alls, eller det finns siffror, men inte fler än fem.

Kvantifierare kan tillämpas på antingen ett enskilt tecken eller en grupp:

[A-Ya-me] (1,3)

Denna konstruktion kommer att välja från texten alla ryska ord med en, två eller tre bokstäver (till exempel "eller", "inte", "jag", "jag går", etc.)

Förutom lockigt hängslen c, finns det ytterligare tre meta-tecken-kvantifierare: "*" (asterisk), "+" (plus) och "?" (fråga). De används i fall där det minsta och maximala antalet nödvändiga repetitioner inte är känt i förväg. När du till exempel söker efter e-postadresser kan du inte i förväg berätta hur många tecken som kommer att finnas i ett användarnamn (före "hund") och hur många i ett domännamn (efter "hund").

"*"-metateckenet läses som "valfritt tal från noll eller mer", dvs. design

definierar valfritt antal på varandra följande bokstäver, inklusive deras fullständiga frånvaro.

"+"-symbolen skiljer sig från asterisken endast genom att den kräver minst en symbol. De där. design

matchar valfri numerisk sekvens, där det finns en eller flera siffror.

Symbol "?" matchar frånvaron eller närvaron av ett enskilt tecken. De där. design

matchar valfri numerisk sekvens där det finns en eller två siffror.

Det är värt att nämna här en sådan funktion av antiifierarna "*" och "+" som girighet... Summan av kardemumman är att dessa tecken som standard matchar den längsta möjliga sekvensen av tecken. Till exempel, för raden "Mamma tvättade ramen" uttrycket:

kommer att välja "mama soap ra", vilket är något oväntat, eftersom vi skulle få "ma". För att ändra detta beteende, använd "?" (frågetecken), skrivet omedelbart efter kvantifieraren. Det kväver aptiten hos kvantifierare genom att tvinga dem att returnera den första matchen, inte den längsta. Låt oss nu ändra föregående exempel:

och vi får den önskade matchningen "ma".

Den sista delen av språket är modifierare... En modifierare är ett specialtecken som definierar "system"-parametrarna för analysen av reguljära uttryck. Det finns bara fyra sådana symboler, de kan användas både individuellt och samtidigt:

i Slår på skiftlägeskänsligt läge, dvs. versaler och små bokstäver skiljer sig inte åt i uttrycket.
m Indikerar att texten som genomsöks ska behandlas som flera rader. Som standard behandlar motorn för reguljära uttryck text som en enda sträng, oavsett vad den egentligen är. Följaktligen indikerar metatecken "^" och "$" början och slutet av all text. Om denna modifierare anges, kommer de att peka på början respektive slutet av varje textrad.
s Standardmetatecken är "." innehåller inte ett radmatningstecken i sin definition. De där. för flerradstext kommer uttrycket /.+/ bara att returnera den första raden, inte all text som förväntat. Genom att specificera denna modifierare tas denna begränsning bort.
U Gör alla metatecken icke giriga som standard. I vissa modifieringar av språket (särskilt i PHP), istället för "U", används symbolen "g", vilket är mer passande för betydelsen ("g" är en förkortning för engelska "greedy", "greedy" ).

Tabellen visar de mest populära och användbara exemplen på reguljära uttryck. Vissa av dem kan verka komplicerade och krångliga för dig, men med en detaljerad studie kommer du utan tvekan att lista ut det.

Reguljära uttryck i PHP.

Det finns speciella funktioner för att arbeta med reguljära uttryck i PHP, vars lista och en kort beskrivning ges i tabellen:

int preg_match (strängmönster, strängämne [, matrismatchningar])

Funktionen kontrollerar om innehållet i ämnet matchar mönstret. Returnerar 1 om matchningar hittas, annars returnerar den 0. Om du anger en valfri arrayparameter, matchar, kommer ett enstaka element att läggas till den - den första matchningen som hittas, när funktionen exekveras.

"; print_r ($ hittades);?>

int preg_match_all (strängmönster, strängämne, arraymatcher [, int order])
Funktionen är identisk med den föregående, med den enda skillnaden - den söker igenom hela texten och returnerar ALLA matchningar som finns i matchningsarrayen.
mixed preg_replace (blandat mönster, blandat ersättning, blandat ämne [, int limit])
Precis som båda tidigare funktioner söker preg_replace efter en text som matchar ett mönster. Funktionen ersätter alla hittade fragment med texten som anges i parametrarna.Före rengöring:\ n $ text \ n \ n "; $ text = preg_replace (" / (\ n \ s (2,)) / "," ", $ text); echo" Efter rengöring:\ n $ text "; // kommer att visa text utan specialtecken // och extra mellanslag?>
mixed preg_replace_callback (blandat mönster, blandat återuppringning, blandat ämne [, int limit])
Funktionen är en utökad version av den tidigare. Den största skillnaden är att namnet på funktionen som ska analysera texten och bilda den alternativa texten skickas till denna funktion i parametrarna.
array preg_split (strängmönster, strängämne [, int limit [, int flaggor]])
Denna funktion liknar explodera () och split (). Dess egenhet är att separatorn inte är en fast sträng, utan ett reguljärt uttryck. Funktionen delar upp originaldata i element och placerar dem i utdatamatrisen.
array preg_grep (strängmönster, arrayingång)
Funktionen är avsedd för vanlig sökning i arrayer. För sökningen anges en mall och en matris med indata, och en matris returneras som endast består av element som matchar mallen.

Ovanstående lista över funktioner är långt ifrån komplett, men den är helt tillräcklig för en framgångsrik start av att arbeta med reguljära uttryck. Om du är intresserad av detta ämne - se till att läsa ytterligare litteratur(till exempel Friedls bok "Regular Expressions"). Dessutom, i träningssyfte, rekommenderar jag att du lägger en av de specialprogram för att testa reguljära uttryck (t.ex. "PCRE" eller "RegEx Builder").