Cum se configurează smartphone-uri și PC-uri. Portal de informare
  • Acasă
  • Programe
  • Expresii regulate în php. Expresii regulate (modele)

Expresii regulate în php. Expresii regulate (modele)


Unul dintre cei foarte puternici și caracteristici utile Limbajul PHP - suport pentru expresii regulate. Mulți programatori, atât începători, cât și cei destul de experimentați, sunt intimidați de complexitatea și complexitatea aparentă a limbajului expresiei regulate. Dar te pot asigura - merită. Utilizarea expresiilor regulate simplifică foarte mult munca de prelucrare a textelor și a datelor slab structurate.


Expresii regulate- Acestea sunt expresii scrise într-un limbaj special. Nu vă alarmați, limbajul este destul de ușor de înțeles; tot ce aveți nevoie este experiență și practică.


Cred că ați întâlnit în mod repetat situații în care aveți text (de exemplu, în Microsoft Word) și trebuie să găsiți ceva important în el. Dacă știți exact ce căutați, totul este simplu: apelați dialogul de căutare, introduceți cuvântul de căutare, apăsați butonul și voila - textul este găsit.


Dar ce vei face dacă știi doar dinainte tipul de informații pe care îl cauți? De exemplu, vă confruntați cu sarcina de a găsi toate adresele e-mailîntr-un document de câteva sute de coli. Unii vor vizualiza documentul manual, alții vor introduce câinele (@) în căutare și îl vor căuta. De acord - ambele opțiuni sunt o muncă epuizantă, ingrată.

Aici expresiile regulate vin în ajutor. După o anumită aproximare, expresiile regulate pot fi comparate cu măști sau șabloane care sunt suprapuse textului: dacă textul se potrivește cu masca, atunci acesta este fragmentul dorit. Dar înainte de a lua în considerare utilizarea expresiilor regulate, ne vom familiariza cu sintaxa acestora.

Expresia regulată este șir de text compilate conform anumitor legi și reguli. Un șir este format din caractere și grupuri de caractere, metacaractere, cuantificatori și modificatori.

Sub simbolurile din în acest caz, orice simboluri ale oricărui alfabet sunt înțelese. Și nu numai cele citite. Puteți introduce cu ușurință un caracter necitit într-o expresie, trebuie doar să cunoașteți codul său în formă hexazecimală; De exemplu:

// caractere care pot fi citite a E // caractere și coduri care nu pot fi citite \x41 - la fel ca litera „A” \x09 - caracterul tabulator

Un grup de caractere este mai multe caractere scrise secvențial:

Abvg ACZms

Permiteți-mi să vă atrag imediat atenția asupra faptului că „spațiul” în expresiile regulate este, de asemenea, considerat ca simbol semnificativ, așa că aveți grijă când scrieți expresii. De exemplu, aceste grupuri de caractere sunt expresii DIFERITE:

ABC UNDE ABC UNDE

Următorul element al limbajului sunt metacaracterele. Prefixul „meta” înseamnă că aceste simboluri descriu alte simboluri sau grupurile acestora. Tabelul descrie metacaracterele principale ale limbajului expresiei regulate:

Metacaracterele pentru sarcină caractere speciale
() Paranteze. Definește expresii imbricate.
| Metacaracter de selecție
^ Metacaracterul de început al liniei
$ Metacaracter de sfârșit de linie
\n Caracter de avans de linie (cod hex 0x0A)
\r Caracter de întoarcere car (cod hex 0x0D)
\t Caracter tabulator (cod hex 0x09)
\xhh Inserarea unui caracter cu codul hexazecimal 0xhh, de exemplu \x42 va insera litera latină „B”
Metacaractere pentru specificarea grupurilor de caractere
. Punct. Orice personaj.
\d Cifra (0-9)
\D Nu un număr ( orice personaj cu excepția caracterelor 0-9)
\s Caracter gol (de obicei spațiu și tab)
\S Caracter nevid (toate cu excepția caracterelor identificate prin metacaracterul \s)
\w Un caracter „dicționar” (un caracter care este folosit în cuvinte. De obicei, toate literele, toate numerele și un caracter de subliniere ("_"))
\W Toate, cu excepția caracterelor definite de metacaracterul \w

Metacaracterele din a doua jumătate a tabelului sunt foarte ușor de reținut. "d" - cifră (cifră), "s" - simbol (simbol), "w" - cuvânt (cuvânt). Dacă litera este mare, atunci trebuie să adăugați „NU” la descrierea grupului.

Să luăm, de exemplu, textul „Tricoul roșu are numerele 1812, iar tricoul verde are numerele 2009”. Să ne uităm la exemple ale celor mai simple expresii regulate:

\d\d\d\d - va găsi 1812 și 2009 \D - va găsi toate literele, spațiile și semnele de punctuație \s - va găsi toate spațiile din text.

Dar anul din exemplul nostru poate fi scris nu în patru, ci în două cifre, cuvintele pot avea alte declinări etc. Subseturile de caractere care sunt specificate folosind paranteze pătrate pot ajuta aici:

Înseamnă orice cifră (la fel ca \d) - înseamnă o cifră pară - înseamnă orice simbol al alfabetului latin (în orice caz) sau cifră.

De exemplu, expresia \d\d\d din șirul de testare va găsi doar 1812, dar nu 2009. Această expresie ar trebui citită ca „găsiți toate secvențele de patru cifre în care ultima cifră este 0,2,4,6 sau 8".

Tot ce ne rămâne de menționat sunt cuantificatorii și modificatorii.

Cuantificator este o construcție specială care determină de câte ori trebuie să apară un personaj sau un grup de personaje. Cuantificatorul este scris între paranteze „()”. Sunt posibile două formate de înregistrare: precisă și gamă. Acurate formatul este scris astfel:

Aici X este de câte ori simbolul sau grupul anterior trebuie repetat. De exemplu expresia

A doua formă de înregistrare este intervalul. Înregistrat ca

(X, Y) // sau (,Y) // sau (X,)

unde X este minimul și Y este cantitate maxima repetari. De exemplu:

citit ca „două până la patru cifre scrise în ordine”. Dacă una dintre limite nu este specificată, atunci nu se presupune nicio limitare. De exemplu:

\w(3,) - trei sau mai multe litere. \d(,5) - nu există numere deloc, sau există, dar nu mai mult de cinci.

Cuantificatorii pot fi aplicați fie unui singur caracter, fie unui grup:

[A-Yaa-ya](1,3)

Această construcție va selecta din text toate cuvintele rusești din unu, doi sau trei litere(de exemplu, „sau”, „nu”, „eu”, „mă duc”, etc.)

Pe lângă bretele, mai există trei metacaractere cuantificatoare: „*” (asterisc), „+” (plus) și „?” (întrebare). Ele sunt utilizate în cazurile în care numărul minim și maxim de repetări necesare este necunoscut în prealabil. De exemplu, atunci când căutați adrese de e-mail, nu puteți spune în avans câte caractere vor fi în numele de utilizator (înainte de „câine”) și câte vor fi în numele domeniului (după „câine”).

Metacaracterul „*” este citit ca „orice sumă de la zero sau mai mult”, adică. proiecta

definește orice număr de litere consecutive, inclusiv absența lor completă.

Simbolul „+” diferă de un asterisc doar prin faptul că necesită prezența a cel puțin un caracter. Aceste. proiecta

potrivește orice secvență digitală cu una sau mai multe cifre.

Simbolul „?” se potrivește cu absența sau prezența unui singur personaj. Aceste. proiecta

potrivește orice secvență digitală cu una sau două cifre.

Aici merită menționată o astfel de caracteristică a antiificatorilor „*” și „+” ca lăcomie. Ideea este că, implicit, aceste caractere corespund celei mai lungi secvențe posibile de caractere. De exemplu, pentru linia „mama a spălat cadrul” expresia:

vom alege „mama soap ra”, ceea ce este oarecum neașteptat, pentru că ne așteptam să obținem „ma”. Pentru a schimba acest comportament, utilizați metacaracterul „?” (semnul de întrebare) scris imediat după cuantificator. Limitează „apetitul” cuantificatorilor forțându-i să întoarcă primul meci mai degrabă decât cel mai lung. Acum să schimbăm exemplul anterior:

și obțineți potrivirea necesară „ma”.

Ultimul element al limbajului este modificatori. Un modificator este un caracter special care definește parametrii „sistemului” pentru analiza expresiilor regulate. Există doar patru astfel de simboluri, ele pot fi folosite fie individual, fie simultan:

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 „$” indică începutul și sfârșitul întregului text. Dacă se specifică acest modificator, atunci ei vor indica începutul și, respectiv, sfârșitul fiecărei linii de text.
s Metacaracterul implicit este "." nu include caracterul newline în definiția sa. Aceste. Pentru text pe mai multe linii expresia /.+/ va returna doar prima linie, nu întregul text așa cum era de așteptat. Specificarea acestui modificator elimină această limitare.
U Face ca toate metacaracterele cantitative să nu fie lacome în mod implicit. În unele modificări ale limbii (în special în PHP), în loc de „U”, este folosit simbolul „g”, care este mai în concordanță cu sensul („g” este o abreviere pentru engleza „greedy”, „greedy” ").

Tabelul prezintă cele mai populare și exemplele necesare expresii regulate. Unele dintre ele ți se pot părea complicate și greoaie, dar cu un studiu detaliat vei înțelege fără îndoială.

Expresii regulate în PHP.

Pentru a lucra cu expresii regulate în PHP, există funcții speciale, a căror listă scurtă descriere sunt date in tabel:

int preg_match (model șir, subiect șir [, potriviri matrice])

Funcția verifică dacă conținutul subiectului se potrivește cu modelul. Returnează 1 dacă sunt găsite potriviri, în caz contrar returnează 0. Dacă nu este specificat parametrul necesar-matrice potriviri, apoi atunci când funcția este executată, un singur element va fi introdus în ea - prima potrivire găsită.

"; print_r($găsit); ?>

int preg_match_all (model șir, subiect șir, matrice potrivește [, ordine int])
Funcția este identică cu cea anterioară, cu singura diferență - caută în întregul text și returnează TOATE potrivirile găsite în matricea de potriviri.
mixed preg_replace (model mixt, înlocuire mixtă, subiect mixt [, limită int])
La fel ca ambele funcții predecesoare, preg_replace caută o bucată de text care se potrivește cu un model. Funcția înlocuiește toate fragmentele găsite cu textul specificat în parametri.Înainte de curățare:\n$text\n\n"; $text = preg_replace("/(\n \s(2,))/"," ",$text); echo " Dupa curatare:\n$text"; // va afișa textul fără caractere speciale // și spații suplimentare?>
mixed preg_replace_callback (model mixt, apel invers mixt, subiect mixt [, limită int])
Funcția este o versiune extinsă a celei anterioare. Principala diferență este că acestei funcții i se trece în parametri numele funcției care va analiza textul și va genera text de înlocuire.
matrice preg_split (model șir, subiect șir [, limită int [, steaguri int]])
Această funcție este similară cu funcțiile explode() și split(). Particularitatea sa este că separatorul nu este un șir fix, ci o expresie regulată. Funcția împarte datele sursă în elemente și le plasează în matricea de ieșire.
array preg_grep (model șir, intrare matrice)
Funcția este concepută pentru căutare obișnuită în matrice. Pentru căutare, sunt specificate un șablon și o matrice de date de intrare, iar o matrice este returnată constând numai din elemente care se potrivesc șablonului.

Lista de funcții luate în considerare este departe de a fi completă, dar este destul de suficientă pentru a începe cu succes lucrul cu expresii regulate. Dacă sunteți interesat de acest subiect, nu uitați să citiți lecturi suplimentare(de exemplu, cartea lui Friedl „Expresii regulate”). În plus, în scopuri de instruire, recomand să instalați unul dintre programe speciale pentru testarea expresiilor regulate (de exemplu, „PCRE” sau „RegEx Builder”).

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!" zici tu. 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” în în acest exempluși există 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. Funcția principală , 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 poate fi asta? 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, deci cum o poț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 unul 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? Puteți face acest lucru:

linia - 123a321
mostra -

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
mostra - *

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ă! Amintește-ți 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ță 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 orice registru ș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 că se va întâmpla? Î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ă faci asta? 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ă „O, 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 să învățăm 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 dezvoltarea unui blog cms, prima parte a seriei 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 e tot ce am!

Când lucrați cu texte în orice limbaj modern programare, dezvoltatorii se confruntă în mod constant cu sarcina de a verifica datele introduse pentru conformitate șablonul necesar, căutarea și înlocuirea fragmentelor de test și alte operațiuni tipice pentru prelucrarea informațiilor simbolice. Dezvoltarea propriilor algoritmi de verificare duce la pierderi de timp, incompatibilitate a codului programului și complexitate în dezvoltarea și modernizarea acestuia.

Dezvoltarea rapidă a limbajelor de dezvoltare pentru Internet și WEB a necesitat crearea de instrumente de procesare universale și compacte informații text cu cantitatea minimă de cod necesară pentru aceasta. Limbajul PHP, popular printre începători și dezvoltatori profesioniști, nu face excepție. Exprimarea regulată ca limbaj de șablon de text vă permite să simplificați sarcinile de procesare a textului și să reduceți codul programului cu zeci și sute de linii. Multe probleme nu pot fi rezolvate fără el.

Expresii regulate în PHP

Limbajul PHP conține trei mecanisme de lucru cu expresii regulate - „ereg”, „mb_ereg” și „preg”. Cea mai comună este interfața „preg”, ale cărei funcții oferă acces la biblioteca de expresii regulate PCRE, dezvoltată inițial pentru limbajul Perl, care este inclus cu PHP. Funcțiile preg caută într-un anumit șir de text potriviri conform unui model specific în limbajul expresiei regulate.

Bazele sintaxei

Este imposibil să descrii în detaliu întreaga sintaxă a expresiilor regulate într-un articol scurt, există literatură specială pentru aceasta. Prezentăm doar elementele principale pentru a arăta posibilitățile largi pentru dezvoltator și pentru a înțelege exemplele de cod.

B este definit formal într-un mod foarte complex, așa că haideți să simplificăm descrierea. O expresie regulată este un șir de text. Constă dintr-un model delimitat și un modificator care indică modul de procesare. Posibilă includere în șabloane diverse alternativeși repetări.

De exemplu, în expresia /\d(3)-\d(2)-\d(2)/m separatorul va fi «/» , apoi vine modelul și simbolul "m" va fi un modificator.

Toată puterea expresiilor regulate este codificată folosind metacaractere. Principalul metacaracter al limbii este backslash - „\”. Acesta inversează tipul personajului care îl urmează (de ex. simbol obișnuit se transformă într-un metapersonaj și invers). Un alt metacaracter important este bara oblică „|”, care specifică opțiuni alternativeșablon. Mai multe exemple de metacaractere:

PHP, atunci când procesează expresii regulate, tratează spațiul ca pe un caracter semnificativ separat, astfel încât expresiile ABCWHERE și ABCWHERE sunt diferite.

Submodele

În PHP, submodele obișnuite sunt separate prin paranteze și sunt uneori numite „subexpresii”. Efectuați următoarele funcții:

    Evidențierea alternativelor. De exemplu, șablon căldură(ceva|pasăre|) se potrivește cu cuvintele „căldură”, „pasăre de foc”Şi "friptură". Și fără paranteze va fi doar șir gol, „păsări de curte” și „friptură”.

    Sub-model „incitant”. Aceasta înseamnă că dacă un subșir se potrivește în model, atunci toate potrivirile sunt returnate ca rezultat. Pentru claritate, să dăm un exemplu. Având în vedere următoarea expresie regulată: câștigătorul primește((aur|aurit)(medalie|cupă)) -și o linie pentru a găsi potriviri: „Câștigătorul primește o medalie de aur”. Pe lângă expresia originală, rezultatul căutării va returna: "medalie de aur", „medalie”, „aur”.

Operatori de repetiție (quadrifiers)

Când scrieți expresii regulate, este adesea necesar să analizați repetarea numerelor și simbolurilor. Aceasta nu este o problemă dacă nu există foarte multe repetări. Dar ce să facem când nu știm numărul lor exact? În acest caz, trebuie să utilizați metacaractere speciale.

Pentru a descrie repetițiile, se folosesc cvadrifiere - metasimboluri pentru a specifica cantitatea. Quadrificatoarele sunt de două tipuri:

  • generale, cuprinse între paranteze;
  • abreviat.

Cuantificatorul general specifică numărul minim și maxim de repetări permise ale unui element, exprimate ca două numere între acolade, astfel: x(2,5). Dacă numărul maxim de repetări este necunoscut, al doilea argument este omis: x(2,).

Cuantificatorii scurtă reprezintă simboluri pentru cele mai frecvente repetări pentru a evita dezordinea de sintaxă inutilă. Sunt utilizate în mod obișnuit trei abrevieri:

1. * - zero sau mai multe repetări, ceea ce este echivalent cu (0,).

2. + - una sau mai multe repetări, adică ,).

3. ? - zero sau doar o repetare - (0,1).

Exemple de expresii regulate

Pentru cei care învață expresii regulate, exemplele sunt cel mai bun tutorial. Vom prezenta câteva care își arată capacitățile largi cu un minim de efort. Toate coduri de program pe deplin compatibil cu versiuni PHP 4.x și mai mare. Pentru înţelegere deplină sintaxa și utilizarea tuturor caracteristicilor limbajului, vă recomandăm cartea lui J. Friedl „Expresii regulate”, care discută pe deplin sintaxa și conține exemple de expresii regulate nu numai în PHP, ci și pentru Limbaje Python, Perl, MySQL, Java, Ruby și C#.

Verificarea corectitudinii adresei de e-mail

Sarcină. Există o pagină de internet care solicită vizitatorului o adresă de e-mail. Expresia regulată trebuie să verifice dacă adresa primită este corectă înainte de a trimite mesaje. Verificarea nu garantează că este specificat cutie poştală există de fapt și acceptă scrisori. Dar înlătură-l evident adrese greșite ea poate.

Soluţie. Ca în orice limbaj de programare, expresiile regulate pentru verificarea adresei de e-mail pot fi implementate în PHP în moduri diferite, iar exemplele din acest articol nu sunt ultima și singura opțiune. Prin urmare, în fiecare caz vom furniza o listă de cerințe care trebuie luate în considerare la programare, iar implementarea specifică depinde în întregime de dezvoltator.

Deci, o expresie care verifică dacă un e-mail este valid trebuie să verifice următoarele condiții:

  1. Disponibilitate în linia originală simbol @ și fără spații.
  2. Partea de domeniu a adresei, urmată de simbolul @, conține doar caractere valide pentru numele de domenii. Același lucru este valabil și pentru numele de utilizator.
  3. Când verificați un nume de utilizator, trebuie să căutați caractere speciale precum apostrof sau Aceste caractere sunt potențial periculoase și pot fi găsite în atacuri precum injecția SQL. Evitați astfel de adrese.
  4. Numele de utilizator permit doar un punct, care nu poate fi primul sau ultimul caracter de pe linie.
  5. Numele de domeniu trebuie să conțină cel puțin două și nu mai mult de șase caractere.

Un exemplu care ia în considerare totul conditii specificate, poate fi văzut mai departe în figură.

Verificarea validității URL-urilor

Sarcină. Verificați dacă un anumit șir de text este valid Încă o dată, expresiile regulate de verificare a URL-urilor pot fi implementate într-o varietate de moduri.

Soluţie. Versiunea noastră finală arată astfel:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

Acum să ne uităm la componentele sale mai detaliat folosind figură.

Verificarea numerelor cardurilor de credit

Sarcină. Este necesar să verificați corectitudinea numărului introdus card de plastic cele mai comune sisteme de plată. Opțiune luată în considerare numai pentru carduri

Soluţie. Atunci când creați o expresie, trebuie să țineți cont de posibila prezență a spațiilor în numărul introdus. Numerele de pe card sunt împărțite în grupuri pentru a ușura citirea și dictarea. Prin urmare, este destul de natural ca o persoană să încerce să introducă numărul în acest fel (adică folosind spații).

Scrieți o expresie universală care să țină cont posibile lacuneși cratime, este mai dificil decât pur și simplu aruncarea tuturor caracterelor, cu excepția numerelor. Prin urmare, se recomandă utilizarea metacaracterului /D în expresie, care elimină toate caracterele, cu excepția numerelor.

Acum puteți trece direct la verificarea numărului. Toate companiile producătoare carduri de credit, utilizați un format de număr unic. Exemplul folosește acest lucru, iar clientul nu trebuie să introducă numele companiei - este determinat de număr. Carduri Visaîncepe întotdeauna cu 4 și are o lungime a numărului de 13 sau 16 cifre. MasterCard începe în intervalul 51-55 cu o lungime a numărului de 16. Ca rezultat, obținem următoarea expresie:

Înainte de a vă procesa comanda, puteți verificare suplimentară ultima cifră a numărului, care este calculată folosind algoritmul Luhn.

Verificarea numerelor de telefon

Sarcină. Verificarea corectitudinii numărului de telefon introdus.

Soluţie. Numărul de cifre în liniile fixe și mobile numere de telefon variază semnificativ de la o țară la alta, așa că nu este posibil să verificați universal dacă un număr de telefon este corect folosind expresii regulate. Dar numere internaționale au un format strict și sunt excelente pentru a verifica față de un șablon. Mai mult, din ce în ce mai național operatori de telefonieîncercând să se încadreze standard unificat. Structura numărului este următoarea:

+CCC.NNNNNNNNNNxEEEE, Unde:

C este codul țării, format din 1-3 cifre.

N - număr de până la 14 cifre.

E - extensie opțională.

Plus este element obligatoriu, iar semnul x este prezent numai atunci când este necesară expansiunea.

Ca urmare, avem următoarea expresie:

^\+(1,3)\.(4,14)(?:x.+)?$

Numerele din interval

Sarcină. Trebuie să potriviți un număr întreg într-un anumit interval. În plus, este necesar ca expresiile regulate să se potrivească numai cu numere dintr-un interval de valori.

Soluţie. Iată câteva expresii pentru câteva dintre cele mai frecvente cazuri:

Găsirea unei adrese IP

Sarcină. Trebuie să determinați dacă șirul dat este o adresă IP validă în format IPv4 în intervalul 000.000.000.000-255.255.255.255.

Soluţie. Ca în orice sarcină de pe limbaj PHP, expresia regulată are multe variații. De exemplu, aceasta:

Verificarea expresiei online

Testarea expresiilor regulate pentru corectitudine poate fi dificilă pentru programatorii noi din cauza complexității sintaxei, care diferă de limbajele de programare „obișnuite”. Pentru a rezolva această problemă, există multe teste de expresii online care facilitează verificarea corectitudinii șablonului creat pe text real. Programatorul introduce expresia și datele de testat și vede instantaneu rezultatul procesării. De obicei, există și o secțiune de referință în care sunt descrise în detaliu expresiile regulate, exemplele și diferențele de implementare pentru cele mai comune limbaje de programare.

Dar încrederea totală în rezultatele serviciilor online nu este recomandată tuturor dezvoltatorilor care folosesc PHP. O exprimare regulată, scrisă și testată personal, îți îmbunătățește abilitățile și garantează absența erorilor.

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 posibil, fără a lua în considerare 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. Astfel:

Wildcardurile 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 - transfer cu transportul
\O - traducerea formatului
\v - intabulare verticală
\o - suna
\e - evadare
\033 - notația simbol octal
\x1A - hexazecimal
\c[ - simbolul de control
\l - caracterul următor cu litere mici
\u - majuscule -//-
\L - toate personajele din litere mici 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. Aşa:

Î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 \OŞ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 \OŞ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";

Exemplu:

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

$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” )

Exemplu:

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

$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.

  1. Reguli de exprimare regulată. (regex)
  2. 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.
  3. Șirul de caractere denotă un șir din aceste caractere. Multe personaje posibile (clasa) este cuprinsă între paranteze drepte „”, aceasta înseamnă că în acest loc poate fi unul dintre caracterele indicate între paranteze. 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 alfabet latin
  4. , 0-9 - număr etc.

Forumul portalului PHP. S.U. Expresiile regulate sunt modele speciale pentru căutarea subșirurilor în text. Cu ajutorul lor, puteți rezolva următoarele probleme într-o singură linie: „verificați dacă un șir conține numere”, „găsiți toate adrese de e-mail

", "înlocuiți mai multe semne de întrebare consecutive cu unul."

Să începem cu o înțelepciune populară de programare:

Unii oameni, când se confruntă cu o problemă, gândesc: „Da, sunt deștept, o voi rezolva folosind expresii obișnuite”. Acum au două probleme.

Exemple de șabloane Să începem cu un cuplu exemple simple . Prima expresie din imaginea de mai jos caută o succesiune de 3 litere, unde prima literă este „k”, a doua este orice scrisoare rusă

Orice expresie începe cu un caracter delimitator. Simbolul / este de obicei folosit ca acesta, dar puteți folosi și alte simboluri care nu au un scop special în expresiile regulate, de exemplu, ~, # sau @. Se folosesc delimitatori alternativi dacă caracterul / poate apărea în expresie. Apoi se duce el însuși model de linie, pe care îl căutăm, urmat de un al doilea delimitator și la sfârșit pot fi una sau mai multe litere steag. Ei întreabă opțiuni suplimentare atunci când căutați text. Iată exemple de steaguri:

  • i - spune că căutarea nu trebuie să țină seama de majuscule și minuscule (în mod implicit, diferențiază majuscule și minuscule)
  • u - spune că expresia și textul căutat folosesc codificarea utf-8, și nu doar litere latine. Fără ea, căutarea caracterelor rusești (și a oricăror alte caractere non-latine) ar putea să nu funcționeze corect, așa că ar trebui să o setați întotdeauna.

Șablonul în sine constă din caractere obișnuite și construcții speciale. Ei bine, de exemplu, litera „k” în expresiile regulate înseamnă ea însăși, dar simbolurile înseamnă „orice număr de la 0 la 5 poate fi în acest loc”. Aici lista completa caractere speciale (în manualul PHP sunt numite metacaractere), iar toate celelalte caractere din secvența obișnuită sunt obișnuite:

Mai jos vom analiza semnificația fiecăruia dintre aceste caractere (și vom explica, de asemenea, de ce litera „е” este plasată separat în prima expresie), dar deocamdată să încercăm să aplicăm expresiile noastre regulate textului și să vedem ce se întâmplă. Există în php functie speciala preg_match($regexp, $text, $match) , care ia ca intrare expresia regulată, text și o matrice goală. Verifică dacă textul conține un subșir care se potrivește acest șablonși returnează 0 dacă nu, sau 1 dacă există. Și în tabloul transmis, prima potrivire găsită cu secvența obișnuită este plasată în elementul cu indicele 0. Să scriem un program simplu care aplică expresii regulate diferitelor șiruri de caractere:

După ce ne uităm la exemplu, să studiem expresiile regulate mai detaliat.

Paranteze în expresiile regulate

Să repetăm ​​ce înseamnă ele diferite tipuri paranteze:

  • Acoladele a(1,5) specifică numărul de repetări ale caracterului anterior - în acest exemplu, expresia caută între 1 și 5 litere consecutive „a”
  • Parantezele pătrate înseamnă „oricare dintre aceste caractere”, în acest caz literele a, b, c, x, y, z sau un număr de la 0 la 5. Alte caractere speciale, cum ar fi | sau * - acestea denotă un caracter obișnuit. Dacă în paranteze pătrate la început există un simbol ^, apoi sensul se schimbă în opus: „orice caracter, cu excepția celor indicați” - de exemplu [^a-c] înseamnă „orice caracter, cu excepția a, b sau c”.
  • Paranteze simboluri și expresii de grup. De exemplu, în expresia abc+, semnul plus se referă doar la litera c și această expresie caută cuvinte precum abc, abcc, abccc. Și dacă puneți paranteze a(bc)+, atunci cuantificatorul plus se referă la secvența bc și expresia caută cuvintele abc, abcbc, abcbcbc

Notă: puteți specifica intervale de caractere între paranteze drepte, dar rețineți că litera rusă е este separată de alfabet și pentru a scrie „orice literă rusă” trebuie să scrieți [a-яе].

Bexslashes

Dacă te-ai uitat la alte manuale despre expresiile regulate, probabil ai observat că bara oblică inversă este scrisă diferit peste tot. Undeva se scrie o bară oblică inversă: \d , dar aici în exemple se repetă de 2 ori: \\d .

De ce? Limbajul expresiei regulate necesită să scrieți o singură bară oblică inversă. Cu toate acestea, în rânduri în single și ghilimele duble

În PHP, backslash are și o semnificație specială: un manual despre șiruri.

  • Ei bine, de exemplu, dacă scrieți $x = "\$"; atunci PHP va trata aceasta ca pe o combinație specială și va insera doar caracterul $ în șir (și motorul de expresii regulate nu va ști despre bara oblică inversă înaintea acestuia). Pentru a introduce secvența \$ într-un șir, trebuie să dublăm bara oblică inversă și să scriem codul ca $x = "\\$"; .
  • Din acest motiv, în unele cazuri (unde secvența de caractere are o semnificație specială în PHP) ni se cere să dublăm bara oblică inversă:
  • Pentru a scrie \$ în expresie regulată, scriem "\\$" în cod

Pentru a scrie \\ în expresie regulată, dublăm fiecare bară oblică inversă și scriem „\\\\”

Pentru a scrie o bară oblică inversă și un număr (\1) în format normal, trebuie să dublați bara oblică inversă: „\\1”

  • În alte cazuri, una sau două bare oblice inverse vor da același rezultat: „\\d” și „\d” vor insera o pereche de caractere \d în linie - în primul caz, 2 bare oblice inverse sunt secvența pentru inserarea unei bare oblice inverse , în al doilea caz nu există o secvență specială și caracterele vor fi inserate așa cum sunt. Puteți verifica ce caractere vor fi inserate într-un șir și ce va vedea motorul de expresii regulate folosind echo: echo "\$"; . Da, este dificil, dar ce poți face?
  • Modele speciale în sezonul regulat

De asemenea, există o condiție convenabilă pentru indicarea unei limite de cuvânt: \b .

Această construcție înseamnă că pe o parte a acesteia ar trebui să existe un caracter care este o literă/număr/subliniere (\w), iar pe cealaltă parte ar trebui să existe un caracter care nu este. Ei bine, de exemplu, vrem să găsim cuvântul „pisica” în text. Dacă scriem expresia regulată /cat/ui , atunci va găsi succesiunea acestor litere oriunde - de exemplu, în interiorul cuvântului „bovine”. Este clar că nu ne-am dorit. Dacă adăugăm o condiție de limită a cuvântului expresiei obișnuite: /\bcat\b/ui , atunci acum va fi căutat doar cuvântul de sine stătător „pisica”.

  • Manual

Sintaxa expresiei regulate în PHP, descriere detaliată

Televizoare Samsung cu control prin gesturi - prețuri Control vocal Smart TV