Exemple php preg match. PHP (expresie regulată) - ce este? Exemple și testare de expresii regulate

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ăutați și înlocuiți fragmente de testareși alte operațiuni standard 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. Popular printre începători și dezvoltatori profesionisti limbaj PHP. Expresia regulată ca limbă șabloane 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-o manieră 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. Metacaracterul principal al limbajului 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țiile ca separat simbol semnificativ, deci 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 linie goală, „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 este afectat de minimul și suma maxima a permis repetări ale elementului ca două numere între acolade, de exemplu: 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 enumera câteva care le arată. oportunități ample 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 pe care vizitatorul este întrebat Adresa 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 căi 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. Prezența simbolului @ în șirul sursă și absența spațiilor.
  2. Partea de domeniu a adresei, după simbolul @, conține numai caractere valide pentru nume de domenii. Același lucru este valabil și pentru numele de utilizator.
  3. Când verificați un nume de utilizator, trebuie să determinați dacă 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ă este dat șir de text valid Încă o dată, rețineți că expresiile regulate de validare 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ă 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. Când creați o expresie, trebuie să luați în considerare posibila disponibilitateîn numărul de spații 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 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 - acesta 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 țară la țară, 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ă.

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ă. Este necesar să vă asigurați că întregul se potrivește cu 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ă. Este necesar să se determine dacă șir dat adresa 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) numite adesea standardul egrep:

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

În toate celelalte cazuri bretele sunt considerate simboluri 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. Prin urmare:

Șabloanele funcționează la fel ca ghilimele duble, astfel încât să puteți folosi `\` - simboluri (simboluri 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 un model într-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";

Versiunea 5 Perl 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 simboluri posibile (clasa) este paranteza patrata"", asta î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 ale alfabetului latin, 0-9 este un număr etc.
  4. Forumul portalului PHP. S.U.

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

Acest subiect este destul de dificil, dar voi încerca forma scurta luminează 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 unul potrivit expresie uzuala text;
  • preg_match - doar o căutare obișnuită;
  • preg_split - căutați și împărțiți textul.

De macar, în lecțiile anterioare le-am folosit exact. Mai precis, î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 închidere. Au fost înlocuite cu „”, adică au fost pur și simplu șterse. 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 link-uri atunci pentru că conțineau Cuvinte cheie, pe care l-am analizat. 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 prin OR 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.