Exemple de cum funcționează expresiile regulate în php. PHP (expresie regulată) - ce este? Exemple și testare de expresii regulate

Expresiile regulate sunt un instrument de procesare a șirurilor foarte puternic, dar în același timp greu de înțeles. Voi descrie punctele principale. O expresie regulată este un model de șir. Folosind acest șablon, puteți căuta apariții, puteți efectua înlocuiri și puteți verifica conformitatea cu șablonul.

Reguli pentru crearea unui model

Limitele șablonului trebuie să fie indicate prin anumite simboluri, adesea folosind „ / ", dar prefer să folosesc" # " pentru că abundența de bare oblice înainte/înapoi vă poate irita ochii, iar semnele hash nu sunt de obicei folosite nicăieri altundeva. Deci: " #HereBodyRegularExpression#"

Interior expresie uzuala sunt folosite paranteze - acestea sunt subexpresii care pot fi manipulate, de exemplu:

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

Această expresie este concepută pentru a obține parametrii într-un șir URL. La începutul rândului există un caracter special " ^ " - asta înseamnă începutul liniei. Urmează " /catalog/" - nu există caractere speciale aici, acesta este doar text care ar trebui să fie conținut în linie. Apoi am întâlnit paranteze, adică am ajuns la prima subexpresie. În paranteza patrata denotă setul de caractere care pot apărea într-un șir în acea locație. Semn " - " înseamnă enumerare. Semn " \ " ecrane Simboluri speciale. Astfel, în prima subexpresie putem avea litere MARI și mici ale alfabetului latin, numere de la 0 la 9, o liniuță de subliniere, o liniuță și un punct. Linia și punctul sunt caractere speciale, dar aici sunt scăpate, așa că aici sunt doar personaje. După paranteze pătrate apare semnul „ + " - aceasta înseamnă că caracterul anterior (și pentru noi acesta este un set de caractere specificat între paranteze drepte) poate apărea de 1 sau de mai multe ori. Apoi vine " / " este doar un simbol și o a doua subexpresie similară. Apoi vine " \.html„ce înseamnă textul” .html". Și apoi personaje speciale" .* " un punct înseamnă orice caracter, iar un asterisc înseamnă orice număr al caracterului anterior. Adică după " .html„Orice poate merge.

Indicarea cantității, cuantificatori

Mai sus am luat deja în considerare astfel de simboluri care indică numărul de simboluri anterioare, cum ar fi + Și * . Iată toate posibilitățile de specificare a cantităților:

Personaje speciale

Există abrevieri speciale pentru unele grupuri de caractere:

"Lăcomie"

Să ne uităm la conceptul de lăcomie a expresiei regulate. De exemplu, există o linie:

#()#

Citim: subexpresie:

Totul pare a fi corect, subexpresia se potrivește:

Dar se potrivește și:

Asta vom obține, pentru că... Expresiile regulate sunt lacome în mod implicit. Puteți elimina lăcomia folosind modificatorul " U", ca aceasta:

#()#U

Modificatori

O expresie regulată poate fi urmată de modificatori: " #HereBodyRegularExpression#HereModifiers„Tipuri de modificatori:

i Activează modul fără majuscule, de ex. literele mari și mici în expresie nu diferă.
m Indică faptul că textul căutat trebuie tratat ca fiind format din mai multe rânduri. În mod implicit, motorul de expresii regulate tratează textul ca un singur șir, indiferent de ceea ce este de fapt. În consecință, metacaracterele „^” și „$” indica începutul și sfârșitul întregului text. Dacă se specifică acest modificator, atunci ei vor indica, respectiv, începutul și sfârșitul fiecărui rând de text.
s Metacaracterul implicit este " . „ nu include un caracter de linie nouă în definiția sa. Specificarea acestui modificator elimină această restricție.
U Îndepărtează lăcomia expresiei regulate
u Permite lucrul cu expresiile regulate chirilic în UTF-8, altfel nu funcționează corect.

php Funcții pentru lucrul cu expresii regulate

preg_replace

Căutați și înlocuiți:

Preg_replace ($model mixt , $inlocuire mixt , $subiect mixt [, int $limita = -1 [, int &$număr ]]);

Fiecare valoare poate fi un șir sau o matrice, după caz $subiect array - este returnat un tablou, în caz contrar un șir

preg_split

Împarte un șir folosind o expresie regulată:

Preg_split (șir $pattern , șir $subiect [, int $limită = -1 [, int $flags = 0 ]]);

Returnează o matrice formată din subșiruri ale șirului dat subiect, care este împărțit de-a lungul limitelor corespunzătoare modelului model.

Cea mai frecventă utilizare a expresiilor regulate în Perl este în căutarea și înlocuirea operatorilor, cum ar fi s//, m/, operatori conectivi =~ sau != etc. De regulă, toți acești operatori au opțiuni similare, cum ar fi:

De obicei, toate aceste opțiuni sunt notate ca „/x”. Ele pot fi folosite chiar și în interiorul șabloanelor folosind noua construcție (?...)

Expresiile regulate sau modelele sunt aceleași cu procedurile regexp în Unix. Expresiile și sintaxa sunt împrumutate din procedurile V8 distribuite liber de Henry Spencer, unde sunt descrise în detaliu.

Șabloanele folosesc următoarele metacaractere (caractere care denotă grupuri de alte caractere) adesea numite standardul egrep:

Metacaracterele au modificatori (scriși după metacaracter):

În toate celelalte cazuri, acolade sunt considerate caractere obișnuite (regulate). Astfel "*" este echivalent cu (0,) , "+" este (1,) și "?" - (0,1). n și m nu pot fi mai mari de 65536.

În mod implicit, metacaracterele sunt lacome. Potrivirea este propagată de cât mai multe ori, fără a ține cont de efectul metacaracterelor ulterioare. Dacă doriți să le „reduceți apetitul”, atunci folosiți simbolul „?”. Acest lucru nu schimbă semnificația metacaracterelor, ci doar reduce propagarea. Prin urmare:

Wildcards funcționează la fel ca ghilimelele duble, așa că puteți folosi `\` - caractere (caractere backslash) în ele:

\t - caracter tabulator
\n - linie nouă
\r - un retur cu vagonul
\A - traducerea formatului
\v - intabulare verticală
\A - apel
\e - evadare
\033 - notație simbol octal
\x1A - hexazecimal
\c[ - simbolul de control
\l - caracterul următor cu litere mici
\u - majuscule -//-
\L - toate caracterele sunt litere mici până la \E
\U - în partea superioară -//-
\E - limitator de schimbare a registrului
\Q - anulați acțiunea ca metacaracter

În plus, următoarele metacaractere au fost adăugate la Perl:

Rețineți că acesta este tot „unul” caracter. Utilizați modificatori pentru a indica secvența. Asa de:

În plus, există metacaractere imaginare. Indicarea simbolurilor inexistente în locul în care se modifică valoarea. Ca:

O limită a unui cuvânt (\b) este un punct imaginar între caracterele \w și \W. În cadrul unei clase de caractere, „\b” reprezintă caracterul backspace. Metacaracterele \AȘi \Z- sunt similare cu „^” și „$”, dar dacă începutul liniei „^” și sfârșitul liniei „$” acționează pentru fiecare linie dintr-un șir de mai multe linii, atunci \AȘi \Z indică începutul și sfârșitul unui întreg șir cu mai multe linii.

Dacă gruparea (parantezele) este utilizată în cadrul modelului, atunci numărul subșirului de grup este desemnat ca „\cifră”. Rețineți că urmând modelul dintr-o expresie sau bloc, aceste grupuri sunt notate ca „$cifră”. În plus, există variabile suplimentare:

Exemplu:

$s = „Unul 1 doi 2 și trei 3”; if ($s =~ /(\d+)\D+(\d+)/) ( tipăriți „$1\n”; # Rezultatul „1” imprimați „$2\n”; # „2” imprimați „$+\n” ; # "2" print "$&\n"; # "1 two 2" print "$`\n" # "One " print "$"\n"; # " and three 3";

Perl versiunea 5 conține constructe de șablon suplimentare:

Exemplu:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Găsiți numărul urmat de „-” ( tipăriți „$1\n”; # Rezultatul „2” ) else ( imprimați „eroare de căutare\n” ;

(?!model) - „privind” înainte prin negație:

Exemplu:

$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Găsiți o cifră care nu este urmată de „+” ( tipăriți „$1\n”; # Rezultatul „2” ) else ( imprimați „căutare” eroare\ n";)

(?ismx) - modificatori „interni”. Este convenabil de utilizat în șabloane, unde, de exemplu, trebuie să specificați un modificator în interiorul șablonului.

Reguli de exprimare regulată. (regex)

  1. Orice personaj se reprezintă pe sine, cu excepția cazului în care este un metacaracter. Dacă trebuie să anulați efectul unui metacaracter, puneți „\” în fața acestuia.
  2. Șirul de caractere denotă un șir din aceste caractere.
  3. Setul de caractere posibile (clasa) este cuprins între paranteze drepte „”, aceasta înseamnă că unul dintre caracterele specificate între paranteze poate apărea în acest loc. Dacă primul caracter dintre paranteze este „^”, atunci niciunul dintre caracterele specificate nu poate apărea în acest moment al expresiei. În cadrul unei clase, puteți folosi simbolul „-” pentru a indica o serie de caractere. De exemplu, a-z este una dintre literele mici ale alfabetului latin, 0-9 este un număr etc.
  4. Forumul portalului PHP. S.U.

Să începem cu ce este o expresie regulată. Așa că răspunde-mi la această întrebare: există un „e” în cuvântul „test”? "Mânca!" tu spui. Apoi vă pun o a doua întrebare, cum ați găsit litera „e” în cuvântul „test”? Răspunsul este evident, luăm primul caracter, adică „t” și îl comparăm cu ceea ce căutăm, adică cu „e”. Dacă nu sunt egali, atunci luăm al doilea caracter, adică „e”, și îl comparăm cu ceea ce căutăm, adică „e”. Voila! S-a găsit o potrivire. Răspuns: cuvântul „test” conține litera „e”.

Acum răspunde-mi la încă o întrebare, unde este expresia regulată din acest exemplu? Sper că ați ghicit că expresia regulată de aici este ceea ce căutăm în cuvântul „test”. Adică, litera „e” din acest exemplu este o expresie regulată.

Pentru ce sunt folosite expresiile regulate în PHP? În practica mea, expresiile regulate au fost folosite, de exemplu, pentru a determina dacă o adresă de e-mail a fost compusă corect. Astfel de expresii sunt folosite și pentru a determina corectitudinea numelui de utilizator și a parolei. Folosind expresii regulate, puteți găsi adresa într-un link și o puteți salva. Există multe lucruri pe care le puteți face Analizând acest lucru, puteți identifica funcția principală a expresiilor regulate și două secundare. Functie principala, aceasta este o căutare a potrivirilor într-un șir. Efectele secundare includ salvarea potrivirilor găsite și înlocuirea acestora.

Prima expresie regulată

În teorie, înțelegem cum să găsim caracterul „e” în cuvântul „test”, dar cum este implementat acest lucru în practică? Pentru a utiliza expresii regulate în php, se folosesc de obicei următoarele funcții:

preg_match("expresie regulată (model)", "variabilă în care se efectuează căutarea", "Variabilă în care se salvează rezultatul căutării (parametru opțional)"); - Funcția de potrivire
preg_replace("expresie regulată (model)", "Cu ce ​​să înlocuiți potrivirea găsită", "variabilă în care se face înlocuirea"); - Funcția de înlocuire

Să începem să folosim aceste funcții Iată un exemplu de căutare a caracterului „e” în cuvântul „test”:

$a = "test";
if(preg_match("/e/",$a)) echo "găsit!!";

Codul descrie condiția: dacă se găsește ceva care se potrivește cu modelul în variabila $a, atunci afișați mesajul „găsit!!” După cum probabil ați observat, șablonul nostru se află între două „/”. În acest caz, simbolul „/” simbolizează începutul și sfârșitul tiparului nostru. Sper că acest lucru este clar.

Toate acestea sunt interesante, desigur... dar șablonul nostru este foarte simplu, nu crezi? La urma urmei, rareori avem nevoie să găsim un simbol într-o variabilă. În cele mai multe cazuri, trebuie să găsim multe personaje și, de asemenea, necunoscute. Cum să fii? Să ne punem o problemă și să încercăm să o rezolvăm. Să presupunem că avem un șir format din numere și o literă engleză necunoscută

Cum să găsesc această scrisoare? Ar putea exista orice literă din alfabetul englez, cum o puteți identifica? Tu însuți ai răspuns la întrebarea ta, există orice literă, adică este în intervalul de la a la z. Puteți folosi intervale în expresiile regulate. Dacă nu știm ce caracter căutăm, dar știm cu siguranță că acest caracter este o literă din alfabetul englez, atunci intrarea va fi după cum urmează:

$a = "123a321";
if(preg_match("//",$a)) echo "găsit!!";

Rețineți că intervalul este cuprins între paranteze „[” „]”. Tot ceea ce este cuprins între astfel de paranteze este definit ca unu simbol, în acest caz simbolul variază de la a la z. Dacă trebuie să găsim nu o literă, ci un număr, atunci intrarea va fi astfel:

$a = "abc1cba";
if(preg_match("//",$a)) echo "găsit!!";

De asemenea, vreau să remarc că expresiile regulate sunt sensibile la majuscule și minuscule, deci caracterele „A” și „a” sunt complet diferite, pentru a căuta ambele caractere, scrieți astfel:

$a = "123a321";
if(preg_match("//",$a)) echo "găsit!!";

Există, de asemenea, o căutare pentru litere rusești, efectuată în același mod ca și cu cele engleze:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "găsit!!";

Metacaracterele

Am învățat cum să căutăm un caracter necunoscut într-un șir. Ce să facem dacă trebuie să găsim mai multe personaje? Așa-numitele metasimboluri vin în ajutor... Să presupunem că avem un șir cu cifre și litere, cum îl putem descrie în șablon? Poți sa faci asta:

linia - 123a321
probă -

Hmm... șablonul se potrivește de fapt cu șirul nostru, iar atunci când este verificat pentru conformitate, va da adevăratul mult așteptat! Dar este un fel de înregistrare greoaie, nu crezi?

Iată cum să o scurtați:

linia - 123a321
probă - *

Mi se pare că este mai scurt. Care este simbolul „*”? Acesta este același metasimbol, înseamnă că simbolul pe care l-am descris (și anume, un simbol care poate conține numere de la 0 la 9 sau litere ale alfabetului englez, de la a la z) poate fi repetat la nesfârșit, sau de mai multe ori. Da Da! Acest metasimbol va găsi o potrivire într-o variabilă goală, deoarece chiar și absența simbolului descris de noi va returna adevărată! Tine minte asta

Ce alte metacaractere există?

De exemplu, metacaracterul „+” Este aproape similar cu metacaracterul „*”, cu o mică excepție. „*” va returna adevărat chiar dacă nu există niciun caracter, iar „+” va verifica prezența a cel puțin un caracter. Adică dacă o linie necesită prezența minim un caracter apoi folosește „+” în loc de „*”

Este adesea folosit și metacaracterul „?”. Înseamnă că linia nu trebuie să conțină mai mult de un caracter dorit. Permiteți-mi să dau câteva exemple pentru ultimele două metacaractere pe care le-am descris.

Să presupunem că trebuie să verificăm parola utilizatorului pentru corectitudine. Să ne gândim ce ar trebui să conțină parola de utilizator? Ei bine, în primul rând, trebuie să fie cel puțin un personaj. În al doilea rând, trebuie să conțină numai numere și litere ale alfabetului englez, astfel încât expresia regulată va arăta astfel:

$a = "qwerty12345";

Ce caractere permitem? Litere engleze de orice caz și numere. Acum încercați să lăsați o linie goală în loc de parolă.

$a = "";
if(preg_match("/+/",$a)) echo "Parola este corectă";

Nu veți vedea mesajul „Parola este corectă”. De ce? Deoarece metacaracterul „+” a verificat șirul pentru a vedea dacă are cel puțin un caracter.

Și acum un mic truc, să aruncăm o privire la expresia noastră, nu am permis, ei bine, să zicem un spațiu în ea, nu? puneți un spațiu la sfârșitul parolei și rulați

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Parola este corectă";

Și de ce vedem mesajul nostru despre parola corectă? Este destul de simplu... Funcția preg_match(); își oprește verificarea la primul meci. Adică, simbolul „q” se potrivește cu modelul pe care l-am descris și orice altceva nu mai este important pentru funcție. Iată cum să o remediați:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Parola este corectă";

Adăugând un „^” la începutul unei expresii și un „$” la sfârșit, îi spunem funcției cu ce model ar trebui să se potrivească toate linia. Dacă rulați acest cod, nu veți vedea mesajul, deoarece există un caracter ilegal la sfârșitul parolei - un spațiu

Acum schimbați metacaracterul „+” în metacaracterul „?”. Ce crezi ca se va intampla? În mod corect, nu va apărea niciun mesaj despre corectitudinea parolei, deoarece parola conține mai mult de un caracter. Sper că am explicat corect munca acestor trei metacaractere utilizate frecvent

Uneori „nu” este mai bine

Am învățat cel puțin cum să verificăm că parola este corectă și asta e bine! Permiteți-mi să vă spun despre un alt mod de a căuta ceva într-un șir. Să presupunem că trebuie să verificăm absența numerelor într-un șir. Cum să o facă? Iată linia:

(Am introdus în mod special aceste simboluri „-_+()” în el, astfel încât viața să nu pară miere...) Am putea formula următoarea expresie:

Dar trebuie să recunoaștem că nu știm întotdeauna ce caractere sunt folosite într-o linie, dar știm sigur că nu ar trebui să existe numere în ea! Prin urmare, ar fi mai logic să scrieți pur și simplu un șablon care să omite rândurile în care Nu numere, și nu cele în care există „Doamne, câte simboluri de neînțeles!!!”. Iată un exemplu de expresie compusă corect pentru astfel de probleme:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Fără numere!";

Cum am reușit acest lucru? Am introdus simbolul Dar! capacul „^” ([^0-9]) plasat la început indică faptul că va exista nu ar trebui Sper că s-a rezolvat asta

Ei bine, hai să încheiem încet... Voi da două exemple cu explicații, în timpul cărora vom învăța cum să salvăm rezultatul căutării într-o variabilă și cum să verificăm adresa poștală pentru corectitudine

L-am văzut și l-am salvat!

Blogul meu

$a = " Blogul meu";
preg_match("/ /", $a);

În expresia noastră regulată am descris toate caracterele posibile care pot fi incluse într-un link. Vreau să fiu atent și la ghilimele și caracterele „/” din expresia noastră. Sunt precedate de o bară oblică inversă, pentru ce este? Cert este că „/” și citatul sunt ele însele caractere speciale. Și pentru ca șablonul să le perceapă ca simboluri obișnuite, trebuie să le ecranăm. Escape se face prin adăugarea unei bare oblice inverse înaintea caracterelor speciale. Sper sa fie clar

$a = " Blogul meu";
preg_match("/ /", $a, $b);

Ei bine, în consecință, este necesar să adăugați un parametru suplimentar sub forma variabilei $b, în ​​care va fi stocat linkul găsit. De asemenea, trebuie să știți că rezultatul căutării este plasat într-o matrice. Prin urmare, variabila $b este o matrice. Informațiile pe care le căutăm se află sub indexul 1. Aceasta înseamnă că rezultatul căutării este în variabila $b. Să afișăm rezultatul pe ecran:

$a = " Blogul meu";
preg_match("/ /", $a, $b);
eco $b;

Adresa corectă este cheia succesului!

Și, în sfârșit, răspunsul la întrebare, este corect e-mailul? În primul rând, trebuie să aflați ce caractere sunt permise în adrese? Din câte știu, personajele permise includ:

  • Litere engleze, numere, „_”, „-” ummmm totul pare a fi... Vom continua de aici.
  • În continuare avem „@”
  • După, scrisori englezești
  • În continuare, punct
  • Și din nou litere engleze...

Deci expresia regulată va fi după cum urmează:

$a = " [email protected]";
if(preg_match("/^+@+.+$/", $a)) echo "adresa de e-mail este corectă!";
else echo „adresa de e-mail NU este scrisă corect!”;

Ei bine... sper că astfel de înregistrări nu vă sperie acum și le puteți înțelege destul de bine.

În sfârșit, vreau să spun ceva. Articolul s-a dovedit a fi greoi și, în același timp, a acoperit doar o parte din posibilități. Dacă citiți această propoziție, atunci cel mai probabil ați citit-o până la sfârșit, pentru care vă mulțumesc foarte mult

Referitor la seria de articole despre dezvoltare blog cms, prima parte a ciclului O declar inchisa!În viitorul apropiat vom începe să implementăm panoul de administrare, așa că nu „comutați” Dacă aveți întrebări, vă voi răspunde cu plăcere. Toate cele bune pentru tine, asta este tot de la mine!