Preg ersätt php exempel. Användbara reguljära uttryck för PHP


Låt oss börja med vad ett reguljärt uttryck är. Så svara mig på den här frågan: finns det ett "e" i ordet "test"? "Äta!" du säger. Sedan ställer jag dig en andra fråga, hur hittade du bokstaven "e" i ordet "test"? Svaret är uppenbart, vi tar det första tecknet, det vill säga "t" och jämför det med det vi letar efter, det vill säga med "e". Om de inte är lika, tar vi det andra tecknet, det vill säga "e", och jämför det med det vi letar efter, det vill säga "e". Voila! En matchning hittades. Svar: Ordet "test" innehåller bokstaven "e".

Svara nu på en fråga till, var är det reguljära uttrycket i detta exempel? Jag hoppas att du gissade att det reguljära uttrycket här är det vi letar efter i ordet "test". Det vill säga bokstaven "e" i i detta exempel och det finns ett reguljärt uttryck.

Vad används reguljära uttryck för i PHP? I min praktik användes reguljära uttryck till exempel för att avgöra om en adress var korrekt sammansatt E-post. Sådana uttryck används också för att fastställa riktigheten av användarnamnet och lösenordet. Med hjälp av reguljära uttryck kan du hitta adressen i en länk och spara den. Det finns många saker du kan göra Genom att analysera detta kan du identifiera huvudfunktionen hos reguljära uttryck, och två sidouttryck. Huvudfunktion , detta är en sökning efter matchningar i en sträng. Biverkningar inkluderar att spara de hittade matchningarna och ersätta dem.

Första reguljära uttrycket

I teorin förstår vi hur man hittar tecknet "e" i ordet "test", men hur implementeras detta i praktiken? För att använda reguljära uttryck i php används vanligtvis följande funktioner:

preg_match("reguljärt uttryck (mönster)", "variabel i vilken sökningen utförs", "Variabel i vilken sökresultatet sparas (valfri parameter)"); - Matchande funktion
preg_replace("reguljärt uttryck (mönster)", "Vad ska den hittade matchningen ersättas med", "variabel som ersättningen görs i"); - Byt ut funktion

Låt oss börja använda dessa funktioner Här är ett exempel på hur du söker efter tecknet "e" i ordet "test".

$a = "test";
if(preg_match("/e/",$a)) eko "hittad!!";

Koden beskriver tillståndet: om något som matchar mönstret hittas i variabeln $a, visa då meddelandet "hittad!!" Som du kanske har märkt ligger vår mall mellan två "/". I I detta fall symbol "/" symboliserar början och slutet av vårt mönster. Jag hoppas att detta är tydligt.

Allt detta är naturligtvis intressant... men vår mall är väldigt enkel, tycker du inte? När allt kommer omkring behöver vi sällan hitta någon symbol i en variabel. I de flesta fall behöver vi hitta många karaktärer, och även okända. Hur man är? Låt oss ställa upp ett problem och försöka lösa det. Anta att vi har en sträng som består av siffror och en okänd engelsk bokstav

Hur hittar man detta brev? Det kan finnas vilken bokstav som helst i det engelska alfabetet, så hur kan du identifiera den? Du svarade själv på din fråga, det finns vilken bokstav som helst, det vill säga den ligger i intervallet från a till z. Du kan använda intervall i reguljära uttryck. Om vi ​​inte vet vilken karaktär vi letar efter, men vi vet med säkerhet att denna karaktär är en bokstav i det engelska alfabetet, kommer posten att vara som följer:

$a = "123a321";
if(preg_match("//",$a)) eko "hittad!!";

Observera att intervallet omges av "[" "]" parentes. Allt inom sådana parenteser definieras som ett symbol, i detta fall sträcker sig symbolen från a till z. Om vi ​​inte behöver hitta en bokstav, utan en siffra, kommer posten att se ut så här:

$a = "abc1cba";
if(preg_match("//",$a)) eko "hittad!!";

Jag vill också notera att reguljära uttryck är skiftlägeskänsliga, så tecknen "A" och "a" är helt olika, för att söka efter båda tecknen, skriv så här:

$a = "123a321";
if(preg_match("//",$a)) eko "hittad!!";

Det finns också en sökning efter ryska bokstäver, utförd på samma sätt som med engelska:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) eko "hittad!!";

Metakaraktärer

Vi lärde oss hur man söker efter ett okänt tecken i en sträng. Vad ska vi göra om vi behöver hitta flera karaktärer? Så kallade metasymboler kommer till undsättning... Antag att vi har en sträng med siffror och bokstäver, hur kan vi beskriva den i mallen? Du kan göra det här:

linje - 123a321
prov -

Hmm... mallen matchar faktiskt vår sträng, och när den kontrolleras för efterlevnad kommer den att ge det efterlängtade sant! Men det är en ganska besvärlig skiva, tycker du inte?

Så här förkortar du det:

linje - 123a321
prov - *

Det verkar för mig att det är kortare. Vad är "*"-symbolen? Det här är samma metasymbol, det betyder att symbolen vi beskrev (nämligen en symbol som kan innehålla siffror från 0 till 9 eller bokstäver i det engelska alfabetet, från a till z) kan upprepas i all oändlighet, eller mer än en gång. Jaja! Denna metasymbol kommer att hitta en matchning i en tom variabel, eftersom även frånvaron av symbolen vi beskrev kommer att returnera sant! Kom ihåg det här

Vilka andra metakaraktärer finns det?

Till exempel, metatecknet "+" Det är nästan likt metateckenet "*" med ett litet undantag. "*" kommer att returnera sant även om det inte finns något tecken, och "+" kommer att kontrollera om det finns minst ett tecken. Det vill säga om en linje kräver närvaro minimum ett tecken använd sedan "+" istället för "*"

Metatecken "?" används också ofta. Det betyder att raden inte får innehålla mer än ett önskat tecken. Låt mig ge ett par exempel för de två senaste metakaraktärerna jag beskrev.

Anta att vi måste kontrollera användarens lösenord för korrekthet. Låt oss fundera på vad användarlösenordet ska innehålla? Tja, för det första måste det vara minst en karaktär. För det andra måste det bara innehålla siffror och bokstäver i det engelska alfabetet, så det reguljära uttrycket kommer att se ut så här:

$a = "qwerty12345";

Vilka karaktärer tillät vi? Engelska bokstäver i alla fall och siffror. Försök nu att lämna en tom rad istället för lösenordet.

$a = "";
if(preg_match("/+/",$a)) echo "Lösenordet är korrekt";

Du kommer inte att se meddelandet "Lösenordet är korrekt". Varför? Eftersom metateckenet "+" kontrollerade strängen för att se om den hade minst ett tecken.

Och nu ett litet trick, låt oss ta en titt på vårt uttryck, vi tillät inte, ja, låt oss säga ett mellanslag i det, eller hur? sätt ett mellanslag i slutet av lösenordet och kör

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Lösenordet är korrekt";

Och varför ser vi vårt budskap om rätt lösenord? Det är ganska enkelt... Funktion preg_match(); stoppar sin kontroll vid första matchen. Det vill säga, symbolen "q" passar mönstret vi beskrev, och allt annat är inte längre viktigt för funktionen. Vad ska vi göra? Så här fixar du det:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Lösenordet är korrekt";

Genom att lägga till ett "^" i början av ett uttryck och ett "$" i slutet berättar vi för funktionen vad mönstret ska matcha Allt linje. Om du kör den här koden kommer du inte att se meddelandet, eftersom det finns ett olagligt tecken i slutet av lösenordet - ett mellanslag

Ändra nu metatecken "+" till metatecken "?". Vad tror du kommer hända? Med rätta kommer det inte att visas något meddelande om lösenordets korrekthet, eftersom lösenordet innehåller mer än ett tecken. Jag hoppas att jag förklarade arbetet med dessa tre ofta använda metakaraktärer ordentligt

Ibland är "inte" bättre

Vi har åtminstone lärt oss hur man kontrollerar att lösenordet är korrekt, och det är bra! Låt mig berätta om ett annat sätt att söka efter något i en sträng. Låt oss säga att vi måste kontrollera frånvaron av siffror i en sträng. Hur man gör det? Här är raden:

(Jag introducerade specifikt dessa "-_+()"-symboler i den så att livet inte skulle se ut som honung...) Vi skulle kunna formulera följande uttryck:

Men du måste erkänna, vi vet inte alltid vilka tecken som används i en rad, men vi vet säkert att det inte ska finnas siffror i den! Det skulle därför vara mer logiskt att helt enkelt skriva en mall som skulle hoppa över rader där Nej siffror och inte de där det finns "Herregud vad många obegripliga symboler!!!". Här är ett exempel på ett korrekt sammansatt uttryck för sådana problem:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Inga nummer!";

Hur har vi uppnått detta? Vi har skrivit in symbolen Men! locket "^" ([^0-9]) placerat i början indikerar att det kommer att finnas borde inte Jag hoppas att detta har lösts

Nåväl, låt oss avsluta det långsamt... Jag ska ge två exempel med förklaringar, under vilka vi kommer att lära oss hur man sparar sökresultatet i en variabel, och lär oss hur man kontrollerar postadressen för korrekthet

Jag såg den och sparade den!

Min blogg

$a = " Min blogg";
preg_match("/ /", $a);

I vårt reguljära uttryck beskrev vi alla möjliga tecken som kan inkluderas i en länk. Jag vill också uppmärksamma citatet och "/"-tecken i vårt uttryck. De föregås av ett snedstreck, vad är det till för? Faktum är att "/" och citatet i sig är specialtecken. Och för att mallen ska uppfatta dem som vanliga symboler måste vi screena dem. Escape görs genom att lägga till ett omvänt snedstreck före specialtecken. Jag hoppas att det är klart

$a = " Min blogg";
preg_match("/ /", $a, $b);

Tja, följaktligen är det nödvändigt att lägga till en ytterligare parameter i form av variabeln $b, där den hittade länken kommer att lagras. Du måste också veta att sökresultatet är placerat i en array. Därför är variabeln $b en matris. Informationen vi söker finns under index 1. Det betyder att sökresultatet finns i variabeln $b. Låt oss visa resultatet på skärmen:

$a = " Min blogg";
preg_match("/ /", $a, $b);
eko $b;

Rätt adress är nyckeln till framgång!

Och till sist, svaret på frågan, är e-postmeddelandet korrekt? Först måste du ta reda på vilka tecken som är tillåtna i adresser? Såvitt jag vet inkluderar tillåtna tecken:

  • Engelska bokstäver, siffror, "_", "-" ummmm allt verkar vara... Vi kommer att utgå från detta.
  • Nästa har vi "@"
  • Efter engelska bokstäver
  • Nästa punkt
  • Och igen engelska bokstäver...

Så det reguljära uttrycket blir som följer:

$a = " [e-postskyddad]";
if(preg_match("/^+@+.+$/", $a)) echo "e-postadressen är korrekt!";
annars echo "e-postadressen är INTE korrekt skriven!";

Tja... jag hoppas att sådana uppteckningar inte skrämmer dig nu, och du kan helt förstå dem.

Till sist vill jag säga något. Artikeln visade sig vara omständlig, och täckte samtidigt bara en del av möjligheterna. Om du läser den här meningen har du troligen läst den till slutet, vilket tack så mycket för

Angående artikelserien om att utveckla en cms-blogg, första delen av serien Jag förklarar den stängd! Inom en snar framtid kommer vi att börja implementera adminpanelen, så "växla inte" Om du har några frågor svarar jag gärna. Allt gott till dig, det är allt jag har!

Reguljära uttryck är speciella mönster för att söka efter delsträngar i text. Med deras hjälp kan du lösa följande problem på en rad: "kontrollera om en sträng innehåller siffror", "hitta alla mejladresser", "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 på 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äge (till exempel "katt" eller "KOT" ” passar detta mönster). Det andra uttrycket söker i texten efter tiden 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 ett speciellt syfte i reguljära uttryck, till exempel ~, # eller @. Alternativa avgränsare används om tecknet / 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 frågar ytterligare alternativ när du söker efter text. Här är 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ökning pågår, använd utf-8-kodning, och inte bara brev. Utan det kanske sökningen efter ryska (och alla andra icke-latinska) tecken inte fungerar korrekt, så du bör alltid ställa in den.

Själva mallen består av vanliga tecken och specialkonstruktioner. Tja, till exempel, bokstaven "k" i reguljära uttryck betyder sig själv, men symbolerna betyder "alla siffror från 0 till 5 kan finnas på denna plats." Här full lista specialtecken (i PHP-manualen kallas de metatecken), och alla andra tecken i den vanliga sekvensen är vanliga:

Nedan kommer vi att analysera innebörden av var och en av dessa tecken (och även förklara varför bokstaven "е" placeras 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 reguljärt uttryck, text och tom array. 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. Och i pennan given array Den första matchningen som hittas med den vanliga sekvensen placeras i elementet med index 0. Låt oss skriva ett enkelt program som tillämpar reguljära uttryck på olika strängar:

Efter att ha tittat på exemplet, låt oss studera reguljära uttryck mer i detalj.

Parentes inom reguljära uttryck

Låt oss upprepa vad de betyder olika typer parentes:

  • Tandställning a(1,5) anger antalet upprepningar av föregående tecken - i det här exemplet söker uttrycket efter 1 till 5 på varandra följande bokstäver "a"
  • Hakparenteser betyder "vilket som helst av dessa tecken", i detta fall bokstäverna a, b, c, x, y, z eller en siffra från 0 till 5. Andra specialtecken som | fungerar inte inom hakparenteser. eller * - de anger ett vanligt tecken. Om i hakparentes i början finns en ^-symbol, sedan ändras betydelsen till det motsatta: "vilket som helst tecken utom de som anges" - 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 söker efter ord som abc, abcc, abccc. Och om du sätter parentes a(bc)+, så hänvisar kvantifieraren plus till sekvensen bc och uttrycket letar efter orden abc, abcbc, abcbcbc

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

Bexslashes

Om du har tittat på andra handledningar om reguljära uttryck, har du förmodligen märkt att backslash skrivs olika överallt. Någonstans skriver de ett omvänt 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. Dock i rader i singel och dubbla citattecken i PHP har backslash också en speciell betydelse: en manual om strängar. Tja, till exempel, om du skriver $x = "\$"; då kommer PHP att behandla detta som en speciell kombination och bara infoga $-tecknet i strängen (och det reguljära uttrycksmotorn 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, i vissa fall (där sekvensen av tecken har en speciell betydelse i PHP) måste vi dubbla omvänt snedstreck:

  • För att skriva \$ i reguljärt uttryck, skriver vi "\\$" i kod
  • För att skriva \\ i reguljärt uttryck dubblar vi varje snedstreck och skriver "\\\\"
  • För att skriva ett omvänt snedstreck och ett tal (\1) i vanligt format måste du dubbla snedstrecket: "\\1"

I andra fall kommer ett eller två snedstreck att ge samma resultat: "\\d" och "\d" kommer att infoga ett par tecken \d i raden - i det första fallet är 2 snedstreck sekvensen för att infoga ett omvänt snedstreck , i det andra fallet finns det ingen speciell sekvens och tecknen kommer att infogas som de är. Du kan kontrollera vilka tecken som kommer att infogas i en sträng och vad motorn för reguljära uttryck kommer att se med hjälp av echo: echo "\$"; . Ja, det är svårt, men vad kan du göra?

Specialdesign under ordinarie säsong

  • \d söker efter valfri siffra, \D - vilket tecken som helst utom en siffra
  • \w matchar valfri bokstav (i valfritt alfabet), siffra eller understreck _ . \W matchar alla tecken utom en bokstav, siffra eller 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 ska finnas ett tecken som är en bokstav/siffra/understreck (\w), och på andra sidan ska det finnas ett tecken som inte är det. Tja, till exempel vill vi hitta ordet "katt" i texten. Om vi ​​skriver det reguljära uttrycket /cat/ui, kommer det att hitta sekvensen av dessa bokstäver var som helst - till exempel inuti ordet "boskap". Det är helt klart inte vad vi ville ha. Om vi ​​lägger till ett ordgränsvillkor till det reguljära uttrycket: /\bcat\b/ui , så kommer nu bara det fristående ordet "cat" att sökas.

Manuell

  • Syntax för reguljära uttryck i PHP, detaljerad beskrivning

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 sådana, skräms av den uppenbara komplexiteten och invecklade språket med reguljära uttryck. Men jag kan försäkra dig - det är värt det. Användningen av reguljära uttryck förenklar avsevärt arbetet med att bearbeta texter och svagt strukturerade data.


Reguljära uttryck är uttryck skrivna på ett speciellt språk. Var inte orolig, språket är ganska lätt att förstå; allt du behöver är erfarenhet och övning.


Jag tror att du upprepade gånger 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: ta fram sökdialogrutan, skriv in sökordet, tryck på knappen och voila - texten hittas.


Men vad gör du om du bara i förväg vet vilken typ av information du letar efter? Du ställs till exempel inför uppgiften att hitta alla e-postadresser i ett dokument på ett par hundra ark. Vissa kommer att visa dokumentet manuellt, andra kommer att skriva in hunden (@) i sökningen och söka efter den. Håller med - båda alternativen är otacksamma, otacksamma arbete.

Det är här reguljära uttryck kommer till undsättning. Till viss approximation kan reguljära uttryck jämföras med masker eller mallar som är överlagrade på text: om texten matchar masken är detta det önskade fragmentet. Men innan vi överväger användningen av reguljära uttryck kommer vi att bli bekanta med 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 grupper av tecken, metatecken, kvantifierare och modifierare.

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

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

En teckengrupp är flera tecken skrivna i följd:

Abvg ACZms

Jag skulle vilja uppmärksamma dig omedelbart - "utrymmet" i reguljära uttryck anses också vara en betydande karaktär, så var försiktig när du skriver uttryck. Till exempel är dessa teckengrupper OLIKA uttryck:

ABC VAR ABC VAR

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

Metatecken för att specificera specialtecken
() Fästen. Definierar kapslade uttryck.
| Urvalsmetatecken
^ Metatecken i början av raden
$ End of line metatecken
\n Radmatningstecken (hex-kod 0x0A)
\r vagnreturtecken (hex-kod 0x0D)
\t Tab-tecken (hex-kod 0x09)
\xhh Om du infogar ett tecken med hexadecimal kod 0xhh, till exempel \x42, infogas 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 (alla tecken utom tecknen 0-9)
\s Tomt tecken (vanligtvis mellanslag och tabb)
\S Icke-tomt tecken (alla utom tecken som identifieras av metatecken \s)
\w Ett "ordbok"-tecken (ett tecken som används i ord. Vanligtvis alla bokstäver, alla siffror och ett understreck ("_"))
\W Alla utom tecken som definieras av metatecken \w

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

Låt oss ta till exempel texten "Den röda tröjan har siffrorna 1812, och den gröna tröjan har siffrorna 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 året i vårt exempel kan inte skrivas med fyra, utan med två siffror, ord kan ha andra deklinationer, etc. Underuppsättningar av tecken som specificeras med hakparenteser kan hjälpa till här:

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

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

Allt vi har kvar att nämna är kvantifierare och modifierare.

Kvantifierareär en speciell konstruktion som bestämmer hur många gånger en karaktär eller grupp av tecken måste förekomma. Kvantifieraren skrivs inom parentes "()". Två inspelningsformat är möjliga: exakt och omfång. Exakt formatet är skrivet så här:

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

Den andra formen av inspelning är räckvidd. Inspelad 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 siffror skrivna i följd." Om en av gränserna inte anges, antas ingen begränsning. Till exempel:

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

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

[A-Yaa-ya](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 lockiga hängslen finns det ytterligare tre kvantifierande metatecken: "*" (asterisk), "+" (plus) och "?" (fråga). De används i de fall där det minsta och maximala antalet nödvändiga repetitioner är okänt i förväg. När du till exempel söker efter e-postadresser kan du inte säga i förväg hur många tecken som kommer att finnas i användarnamnet (före "hund") och hur många som kommer att finnas i domännamnet (efter "hund").

Metatecken "*" läses som "valfri mängd 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 en asterisk endast genom att den kräver minst ett tecken. De där. design

matchar valfri digital sekvens med en eller flera siffror.

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

matchar valfri digital sekvens med en eller två siffror.

Här är det värt att nämna en sådan egenskap hos antiifierarna "*" och "+" som girighet. Poängen är att dessa tecken som standard motsvarar 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 förväntade oss att få "ma". För att ändra detta beteende, använd metatecken "?" (frågetecken) skrivet omedelbart efter kvantifieraren. Det begränsar "aptiten" hos kvantifierare genom att tvinga dem att returnera den första matchen snarare än den längsta. Låt oss nu ändra föregående exempel:

och få den önskade matchningen "ma".

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

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

Tabellen visar de mest populära och nödvändiga exemplen på reguljära uttryck. Vissa av dem kan verka komplicerade och besvärliga för dig, men med detaljerade studier kommer du utan tvekan att förstå.

Reguljära uttryck i PHP.

Det finns speciella funktioner för att arbeta med reguljära uttryck i PHP, en lista över dessa 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 0. Om du anger den valfria matchningsarrayparametern, kommer ett enstaka element att matas in i den när funktionen exekveras - den första matchningen som hittas.

"; print_r($found); ?>

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 dess föregångare, 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 rensad från 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 denna funktion skickas i parametrarna namnet på funktionen som kommer att analysera texten och generera ersättningstext.
array preg_split (strängmönster, strängämne [, int limit [, int flaggor]])
Denna funktion liknar funktionerna explode() och split(). Dess egenhet är att separatorn inte är en fast sträng, utan ett reguljärt uttryck. Funktionen delar upp källdata i element och placerar dem i utdatamatrisen.
array preg_grep (strängmönster, arrayingång)
Funktionen är designad för regelbunden 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.

Listan över övervägda funktioner är långt ifrån komplett, men den är ganska tillräcklig för en framgångsrik start på 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"). I utbildningssyfte rekommenderar jag dessutom att du installerar ett av specialprogrammen för att testa reguljära uttryck (till exempel "PCRE" eller "RegEx Builder").

Reguljära uttryck är ett mycket användbart verktyg för utvecklare. Med reguljära uttryck kan du kontrollera, söka och ändra text för korrekthet.
Den här artikeln innehåller några mycket användbara uttryck som du ofta behöver arbeta med.

Introduktion till reguljära uttryck

När de först introduceras till reguljära uttryck kan de verka svåra att förstå och använda. Faktum är att allt är enklare än det verkar. Innan vi tittar på komplexa exempel, låt oss titta på grunderna:

Funktioner för att arbeta med reguljära uttryck i PHP

Domänverifiering

Söker efter rätt domännamn.

$url = "http://example.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i", $url)) ( echo "Ok."; ) else ( echo "Fel url."; )

Markera ord i text

Ett mycket användbart reguljärt uttryck för . Användbar för sökning.

$text = "Exempelsats, regex har blivit populärt inom webbprogrammering. Nu lär vi oss regex. Enligt wikipedia skrivs reguljära uttryck (förkortade som regex eller regexp, med pluralformer regexps, regexps eller regexen) på ett formellt språk som kan tolkas av en processor för reguljära uttryck"; $text = preg_replace("/b(regex)b/i", " 1", $text); echo $text;

Markering av sökresultat i WordPress

Som redan nämnts är det föregående exemplet mycket användbart för . Låt oss tillämpa det på WordPress. Öppna filen search.php, hitta funktionen titeln(). Ersätt den med följande:

Echo $titel;

Nu, innan denna rad, infoga koden:

\0", $title); ?>

Öppna filen style.css. Lägg till raden till det:

Strong.search-excerpt ( bakgrund: gul; )

Få alla bilder från ett HTML-dokument

Om du någon gång behöver hitta alla bilderna på en HTML-sida kommer följande kod att vara användbar. Med den kan du enkelt skapa en bilduppladdning med .

$images = array(); preg_match_all("/(img|src)=("|")[^"">]+/i", $data, $media); unset($data); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($data som $url) ( $info = pathinfo($url); if (isset($info["extension"])) ( if (($info["extension"] == "jpg") || ($info["extension"] == "jpeg") || ($info["extension"] == "gif") || ($info["extension"] == "png")) array_push($ bilder, $url);

Ta bort dubbletter av ord (oberoende av skiftlägen)

$text = preg_replace("/s(w+s)1/i", "$1", $text);

Ta bort dubbletter av skiljetecken

Liknar den föregående, men tar bort skiljetecken.

$text = preg_replace("/.+/i", ".", $text);

Hitta en XML/HTML-tagg

En enkel funktion som tar två argument: taggen som ska hittas och en sträng som innehåller XML eller HTML.

Funktion get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?).")", $xml, $matches, PREG_PATTERN_ORDER); returnera $matches;

Hitta en XML/HTML-tagg med ett specifikt attributvärde

Funktionen liknar den tidigare, men det blir möjligt att ange ett taggattribut. Till exempel:

.

Funktion get_tag($attr, $value, $xml, $tag=null) (if(is_null($tag)) $tag = "\w+"; annars $tag = preg_quote($tag); $attr = preg_quote($ attr); $värde = preg_quote($värde_regex = "/);<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$värde\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; )

Hitta hexadecimala färgkoder

Funktionen låter dig hitta eller kontrollera riktigheten av hexadecimala färgkoder.

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "exempel 6 framgångsrikt."; )

Hitta sidans titel

Denna kod kommer att hitta och visa texten mellan taggarna </i> Och <i> HTML-sidor.

$fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$page,$regs); echo $regs; fclose($fp);

Parsar Apache-loggar

Många webbplatser körs på Apaches webbserver. Om din sida också körs på en tacoserver kan följande vanliga rutiner vara användbara.

//Loggar: Apache webbserver // Framgångsrika åtkomster till html-filer. Användbar för att räkna sidvisningar. "^((?#klient-IP eller domännamn)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?: GET|POST|HEAD) ((?#fil)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#statuskod)200s+((?#bytes överförda)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent )[^"]*)"$" //Loggar: Apache-webbserver //404-fel "^((?#klient-IP eller domännamn)S+)s+((?#basic authentication)S+s+S+)s+ [((?#datum och tid)[^]]+)]s+"(?:GET|POST|HEAD) ((?#fil)[^ ?]+)??((?#parameters)[^ ? "]+)? HTTP/+"s+(?#statuskod)404s+((?#bytes överförda)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent )[^"]*)"$")

Ersätter dubbla citattecken med lockiga citattecken

preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $text);

Kontrollerar lösenordets komplexitet

Detta reguljära uttryck kontrollerar en sträng punkt för punkt: strängen måste innehålla minst 6 bokstäver, siffror, understreck och bindestreck. Raden måste innehålla minst en stor bokstav, en liten bokstav och en siffra.

"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

WordPress: Få inläggsbilder med reguljära uttryck

Om du använder WordPress kan det vara användbart att ha en funktion som hämtar alla bilder från ett inlägg och visar dem. För att använda den här koden, kopiera den till dina temafiler.

post_content; $szSearchPattern = "~ ]* />~"; // Kör preg_match_all för att ta alla bilder och spara resultaten i $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics); // Kontrollera om vi har minst 1 bild $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) ( // Här skulle du göra vad du än behöver göra med bilderna // För det här exemplet visas bilderna bara för ($i=0; $i)< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

Konvertera uttryckssymboler till bilder

Den här funktionen är också tillgänglig i WordPress, den låter dig automatiskt ersätta uttryckssymboler med bilder.

$texte="En text med en smiley:-)"; echo str_replace(":-)"," ",$texte);







2024 gtavrl.ru.