Acasă / Prezentare generală Windows / PHP obișnuit din numărul șirului. PHP regexp: exemple de expresii regulate. Exemple de expresii regulate

PHP obișnuit din numărul șirului. PHP regexp: exemple de expresii regulate. Exemple de expresii regulate

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 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ă a fost compusă corect e-mail. 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ă ceva care se potrivește cu modelul este găsit în variabila $a, atunci afișați mesajul „găsit!!” După cum probabil ați observat, șablonul nostru se află între două „/”. ÎN î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, 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 utiliza 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
proba - *

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 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 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 un tablou. 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 Il declar inchis!Î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!

) V-am arătat un exemplu de utilizare a expresiilor regulate pentru a găsi anumite fragmente din codul sursă al unei pagini. Acum vom învăța cum să le scriem noi înșine. Această abilitate vă va ajuta să scrieți, să ștergeți textul din fragmentele inutile, să căutați părțile necesare în volume mari de text și așa mai departe.

Acest subiect este destul de complicat, dar voi încerca să acopăr pe scurt cel mai mult puncte importante. Nu știu cât de reușit voi avea, dar sper că lecția va fi de folos.
Deci, să începem cu faptul că există mai multe funcții pentru a lucra cu expresii regulate în PHP, dar trei sunt cel mai des folosite:

  • preg_replace — caută și înlocuiește textul care corespunde unei expresii regulate;
  • preg_match - doar o căutare obișnuită;
  • preg_split - căutați și împărțiți textul.

Cel puțin, în lecțiile anterioare le-am folosit. Mai exact, în loc de preg_match a existat preg_match_all, dar acesta este în esență același lucru, doar că acesta din urmă nu întrerupe căutarea după prima constatare. Adică, dacă folosim preg_match, nu vom găsi toate aparițiile, ci doar prima.

Alegerea funcției de utilizat în ce situație este destul de simplă. Trebuie să înlocuim - folosim înlocuire, ca și în cazul în care trebuia să eliminăm părțile inutile ale codului paginii, vă amintiți?

$pagina = preg_replace("/ ^]/i", "", $pagina); $pagina = preg_replace("/ ^]/i", "", $pagina); $pagina = str_inlocuire("", "", $pagina);

Primul parametru al funcției este un caracter obișnuit care determină ceea ce căutăm. Al doilea este cu ce îl înlocuim. Al treilea - Unde căutăm? Prin urmare, aici am luat variabila $page și i-am atribuit rezultatul funcției preg_replace, unde am căutat toate tipurile de intrare=checkbox, precum și etichetele de deschidere și de închidere. Le-au înlocuit cu „, adică le-au șters pur și simplu. Sper că totul este clar aici. Vom trece la analiza expresiei în sine (primul parametru al funcției) puțin mai târziu.
A existat și un exemplu de utilizare a preg_match_all, care a fost util pentru a găsi toate linkurile din textul rămas. Aveam nevoie de linkuri atunci, deoarece acestea conțineau cuvintele cheie pe care le analizam. Iată ce s-a întâmplat:

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

Primul parametru este din nou o expresie regulată pentru a găsi toate legăturile care sunt în mod natural incluse în eticheta „a” (dacă nu sunteți familiarizat cu marcajul html, atunci citiți). A doua este o variabilă care conține textul care va fi căutat. Al treilea parametru este o variabilă în care este plasat rezultatul - $ok. După aceasta, tot ce rămâne este să parcurgem toate elementele necesare ale $ok pentru a obține prinderile cheie de care avem nevoie. Separat, trebuie spus că la ieșire obținem o matrice multidimensională. De aceea am afișat-o într-un mod atât de complex: $ok[$j]. Pentru a vizualiza structura matricei, utilizați funcția de mai jos și veți înțelege totul.

Print_r($ok);

Se pare că am aranjat funcțiile pe care le-am folosit pentru munca noastră. Acum tot ce rămâne este să înveți cum să scrii aceleași expresii regulate, care sunt primul parametru al fiecăreia dintre aceste metode. Să trecem la cel mai important lucru.

Cum să scrieți propoziții obișnuite

În primul rând, să ne uităm la structurile de bază. Expresiile au opțiuni. Sunt specificate printr-o literă și scrise la sfârșit, precedate de o bară oblică.

În plus, sunt acceptate următoarele metacaractere:

Metacaracterele, la rândul lor, pot avea modificatori:

Ei bine, acum putem trece la analizarea tiparelor noastre obișnuite din ultima lecție. Pe baza semnelor de mai sus, să încercăm să înțelegem ce avem. Iată expresia:

/^]/i

Prima și ultima bară oblică „/” indică faptul că în interiorul lor există o expresie regulată. În același timp, după ultimul am pus „i”, aceasta este o opțiune, ca în primul tabel - nu țineți cont de caz. În interiorul barelor oblice se află secvența obișnuită în sine. Începe cu semnul mai puțin decât și eticheta de intrare și tot ce urmează după aceea până la semnul punctului este doar text simplu de căutat. Dar punctul în sine și simbolurile de după el sunt mai interesante. În acest caz, construcția „.*?” înseamnă orice succesiune de caractere. Adică, dacă combinăm doar textul și această construcție, atunci vom selecta tot textul după prima apariție și până la sfârșit. Pentru a opri, trebuie să întâlniți fie o etichetă HTML de închidere „mai mult decât” sau un nou caracter de linie. Acest design ne oferă tocmai o astfel de oportunitate:

Caracterele dintre paranteze drepte sunt conectate printr-un SAU logic. Sfârșitul este semnul mai mare decât SAU începutul liniei.
Asta e toată expresia, în ea setăm condiția de început, condiția de mijloc și de sfârșit. Nu e greu, nu? Iată o ilustrație pentru claritate:

Să ne uităm la încă un lucru pentru a consolida totul. Am căutat legături cu ei:

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

Citim expresia. Din nou, aruncăm mai întâi barele oblice și opțiunile. Indicatoarele „uis” se explică de la sine, cu excepția „u”, pe care nu l-am descris - arată că folosim codificarea Unicode. Nu a mai rămas mult. Începutul este eticheta „a”, care se deschide, apoi vine clasa

ceea ce înseamnă NU mai mare decât sau mai mic decât (deschiderea și închiderea etichetelor HTML), adică orice caractere în acest caz. „+?” se adaugă la clasă, ceea ce înseamnă că această clasă va fi prezentă de o dată sau de mai multe ori (dar cel puțin o dată cu siguranță). Și apoi vine eticheta html de închidere pentru eticheta „a”. Există text în interiorul linkului care este specificat de grup

La urma urmei, nu știm ce fel de text va fi acolo, așa că definim un astfel de grup. Și la sfârșit există o etichetă de închidere „a”:

Vă rugăm să rețineți că scăpăm de bară oblică folosind o bară oblică inversă, astfel încât să fie percepută ca text simplu.

Uf. Tema este într-adevăr destul de complexă, necesită practică. Poate că fac ceva care nu este deloc optim și este posibil să creez alte expresii regulate mai corecte, dar sunt la fel de autodidact ca și tine, așa că nu judeca strict, ci mai degrabă împărtășește opțiunile tale în comentarii. De asemenea, dacă ceva nu este clar, comentariile și pagina de contact vă stau la dispoziție.

Când lucrează cu texte în orice limbaj de programare modern, dezvoltatorii se confruntă în mod constant cu sarcinile de verificare a datelor introduse pentru conformitatea cu modelul dorit, căutarea și înlocuirea fragmentelor de testare și alte operațiuni tipice pentru procesarea 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 universale și compacte pentru procesarea informațiilor text cu o cantitate 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

Într-un articol scurt este imposibil să descriem în detaliu întreaga sintaxă a expresiilor regulate, există o 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. Este posibil să includeți diverse alternative și repetări în șabloane.

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ă (adică, un caracter obișnuit devine metacaracter și invers). Un alt metacaracter important este bara oblică „|”, care specifică variante alternative ale modelului. 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 ar fi doar un șir gol, „pasăre” și „prăjire”.

    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 sunt 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,).

Cuantificatoarele scurte reprezintă simboluri pentru cele mai comune repetări pentru a evita aglomerația inutilă de sintaxă. 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 codurile de program sunt pe deplin compatibile cu versiunile PHP 4.x și ulterioare. Pentru a înțelege pe deplin sintaxa și a utiliza toate caracteristicile 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 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ă cutia poștală specificată există efectiv și acceptă scrisori. Dar poate elimina adresele evident incorecte.

Soluţie. Ca și în cazul oricărui limbaj de programare, expresiile regulate de verificare a adresei de e-mail pot fi implementate în PHP într-o varietate de moduri, iar exemplele din acest articol nu sunt cele mai importante. 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. Prezența simbolului @ în șirul sursă și absența spațiilor.
  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, cum ar fi un apostrof sau Aceste caractere sunt potențial periculoase și pot fi folosite î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 ține cont de toate aceste condiții poate fi văzut mai jos î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 adreselor URL 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ă se verifice corectitudinea numărului de card de plastic introdus pentru 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).

Scrierea unei expresii universale care ia în considerare posibilele spații ș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 de carduri de credit folosesc un format de număr unic. Exemplul folosește acest lucru, iar clientul nu trebuie să introducă numele companiei - acesta este determinat de număr. Cardurile Visa încep întotdeauna cu 4 și au 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 procesa o comandă, puteți efectua o verificare suplimentară a ultimei cifre 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 din numerele de telefon fix și mobil variază semnificativ de la o țară la alta, așa că nu este posibil să se verifice universal dacă un număr de telefon este corect folosind expresii regulate. Dar numerele internaționale au un format strict și sunt grozave pentru verificarea șablonului. Mai mult, tot mai mulți operatori naționali de telefonie încearcă să respecte un singur standard. 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ă.

Plusul este un element necesar, iar semnul x este prezent doar atunci când este necesară extinderea.

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 și în cazul oricărei sarcini din PHP, expresiile regulate au 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.


Una dintre caracteristicile foarte puternice și utile ale limbajului PHP este suportul 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.


Expresiile regulate 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 când 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 de 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.

O expresie regulată este un șir de text compus în conformitate cu anumite legi și reguli. Un șir este format din caractere și grupuri de caractere, metacaractere, cuantificatori și modificatori.

În acest caz, simbolurile înseamnă orice simbol al oricărui alfabet. Ș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

Aș dori să vă atrag atenția imediat - „spațiul” din expresiile obișnuite este, de asemenea, considerat un caracter 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:

Metacaractere pentru specificarea caracterelor 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 este un număr (orice caracter 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 cifrele și o liniuță 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 numărul maxim de repetări. 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 de una, două sau trei litere (de exemplu, „sau”, „nu”, „eu”, „mă duc”, etc.)

Pe lângă acolade, 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ă 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, respectiv, începutul și sfârșitul fiecărui rând de text.
s Metacaracterul implicit este "." nu include caracterul newline în definiția sa. Aceste. pentru textul cu 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ă fie „non-lacomi” în mod implicit. În unele modificări ale limbii (în special în PHP), în loc de „U”, este folosit caracterul „g”, care este mai în concordanță cu semnificația („g” este prescurtare pentru „greedy”, „greedy” în engleză). ).

Tabelul prezintă cele mai populare și necesare exemple de 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.

Există funcții speciale pentru lucrul cu expresii regulate în PHP, a căror listă și o scurtă descriere sunt date în 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ă se găsesc potriviri, în caz contrar returnează 0. Dacă specificați parametrul opțional matchs array, 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, asigurați-vă că citiți literatură suplimentară (de exemplu, cartea lui Friedl „Expresii regulate”). În plus, în scop de instruire, recomand să instalați unul dintre programele speciale pentru testarea expresiilor regulate (de exemplu, „PCRE” sau „RegEx Builder”).

1,6K

Expresii regulate (prescurtat ca regex) sunt secvențe de caractere care formează modele de căutare. Ele sunt utilizate în principal în modelele de potrivire a șirurilor.

Scurt istoric

  • Totul a început în anii 1940-1960, când o mulțime de oameni deștepți vorbeau despre expresii regulate;
  • anii 1970 g/re/p;
  • 1980 Perl și Henry Spencer;
  • 1997 PCRE (Expresii regulate compatibile cu Perl). Acesta este momentul în care a început creșterea a ceea ce numim expresii regulate. PCRE oferă biblioteci pentru aproape fiecare limbă.

Utilizarea generală a expresiilor regulate în PHP

PHP include trei funcții principale pentru lucrul cu PCRE - preg_match, preg_match_all și preg_replace.

Comparație de conformitate

Expresia returnează 1 dacă se face o potrivire, 0 dacă nu și fals dacă apare o eroare:

int preg_match (șir $pattern, șir $subiect [, matrice &$potriviri [, int $flags = 0 [, int $offset = 0 ]]])

Un exemplu de expresie regulată care returnează numărul de potriviri găsite:

int preg_match_all (șir $pattern, șir $subiect [, matrice &$potriviri [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Înlocuire

Expresia returnează șirul sau tabloul înlocuit ( bazat pe $subiect):

mixed preg_replace (mixt $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int $count ]])

Utilizarea generală a expresiilor regulate în JavaScript

Expresiile regulate în JavaScript arată aproape la fel ca în PHP.

Comparație de conformitate

Returnează o matrice de potriviri sau null dacă nu sunt găsite potriviri:

string.match(RegExp);

Înlocuire

O expresie regulată care returnează un șir cu înlocuirile efectuate:

string.replace(RegExp, înlocuire);

Caracteristicile expresiilor regulate în JavaScript

  • O perioadă nu se potrivește niciodată cu o nouă linie:
  • Aceleași metode pentru compararea potrivirii și înlocuirii prin expresii regulate ca și fără ele.

Principii de compunere a modelelor de expresie regulată

Să ne uităm la un exemplu în care trebuie să găsim adrese de e-mail într-o bază de cod. Scopul nostru:

Prize analogice

Expresiile regulate constau din două tipuri de caractere:

  • caractere speciale: ? * + () () ^ $ / .
  • Literale.

Gândiți-vă la șirurile de intrare ca la șuruburi și la șablon ca la un set de conectori pentru ele (în ordinea corespunzătoare).

Personaje speciale

Când testați expresiile regulate, trebuie să știți cum funcționează caracterele speciale:

  • Caracterul bară oblică inversă \ poate înlocui un alt caracter special într-o expresie regulată:
  • Punct și w - .

Potriviți toate caracterele, cu excepția liniilor noi. Dacă doriți să verificați conformitatea cu un punct și numai cu un punct - , pentru conformitatea cu litere, cifre și liniuțe de subliniere - w

  • Paranteze pătrate.

Potriviți caracterele din paranteze. Suporta intervale. Câteva exemple:
o - se potrivește cu orice a, b sau c.
o majuscule.
o orice număr.
o - Se potrivește cu orice caracter alfabetic cu litere mici sau mari.
Opțional? Potrivire 0 sau 1.
Asterisc *.

Un asterisc indică 0 sau mai multe caractere.

Potriviți 1 sau mai multe caractere.

Bretele ondulate ().

Valori minime și maxime. Câteva exemple de sintaxă a expresiilor regulate:
o (1,) nu mai puțin de 1.
o (1,3) de la 1 la 3.
o (1,64) de la 1 la 64.

Să adăugăm toate acestea pentru a obține o expresie obișnuită pentru adresele de e-mail:

/+@+(.+)*/i


Iată cum arată în PHP:

preg_match_all("/+@+(.+)*/i", $linii_input, $matrice_ieșire);

Utilizarea expresiei regulate pentru validare

Provocare: Asigurați-vă că datele de intrare sunt ceea ce ne așteptăm. Obiectivul 1: /[^w$.]/ Obiectivul 2: /^(1,2)$/

Expresiile regulate sunt bune pentru a găsi elemente, dar trebuie să știi exact ce cauți.

Când nu ar trebui să folosiți o expresie regulată pentru validare?

Multe cazuri sunt mai bine tratate folosind funcția PHP filter_var. De exemplu, validarea adresei de e-mail ar trebui să se facă folosind filtrele încorporate PHP:

filter_var(" [email protected]", FILTER_VALIDATE_EMAIL)

Validare folosind expresii regulate

Expresiile regulate de la sfârșitul unei linii folosesc ancore:

^ - indică începutul unei linii.
$ este un semn de dolar care indică sfârșitul unei linii.

if (!preg_match("%^(1,2)$%", $_POST["subscription_frequency"])) ( $isError = adevărat; )

Clase de caractere excluse

[^abc] - totul, cu excepția a, b sau c, inclusiv liniile noi.

Un exemplu care vă permite să introduceți numai caractere alfanumerice, liniuțe, puncte și liniuțe de subliniere:

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) ( $isError = adevărat; )

Căutați și înlocuiți

Cele mai comune funcții PCRE pentru efectuarea găsirii și înlocuirii sunt preg_replace() și preg_replace_callback() . Dar există și preg_filter() și preg_replace_callback_array() care fac aproape același lucru. Vă rugăm să rețineți că funcția preg_replace_callback_array() este disponibilă începând cu PHP7.

Înlocuiește cuvintele dintr-o listă

$subject = „Vreau să mănânc niște mere.”; echo preg_replace("/mar|banana|portocale/", "fructe", $subiect);

Rezultat

Vreau să mănânc niște fructe.

Dacă o expresie regulată are submodele ( între paranteze), puteți înlocui $N sau N (unde N este un număr întreg >= 1), aceasta se numește „backlink”.

Rearanjarea a două numere

$subiect = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subiect);

Rezultat

Schimbați formatarea datei

$subiect = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subiect);

Rezultat

Un exemplu simplu de înlocuire a unei adrese URL într-o etichetă

$subject = „Vă rugăm să vizitați https://php.earth/doc pentru mai multe articole.”; echo preg_replace ("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subiect) ;

Rezultat