Cum se configurează smartphone-uri și PC-uri. Portal de informare
  • Acasă
  • Ştiri
  • Simboluri cu expresii regulate PHP. Expresii regulate în php

Simboluri cu expresii regulate PHP. Expresii regulate în php

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 preluate din rutinele V8 gratuite ale lui Henry Spencer și sunt descrise în detaliu acolo.

Ș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, acoladele 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ț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. 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.
  4. Setul de caractere posibile (clasa) este cuprins între paranteze drepte „”, aceasta înseamnă că unul dintre caracterele specificate între paranteze poate apărea în acest loc. Dacă primul caracter dintre paranteze este „^”, atunci niciunul dintre caracterele specificate nu poate apărea în acest moment al expresiei. În cadrul unei clase, puteți folosi simbolul „-” pentru a indica o serie de caractere. De exemplu, a-z este una dintre literele mici ale alfabetului latin, 0-9 este un număr etc.

Forumul portalului PHP. S.U.

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 linia de căutare a potrivirilor: „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,).

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 precum apostrof sau Aceste caractere sunt potențial periculoase și pot fi folosite în atacuri precum injectarea 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 procesarea comenzii, 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 țară la țară, 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.

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

Reguli pentru crearea unui model

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

Parantezele sunt folosite în interiorul unei expresii regulate - acestea sunt subexpresii care pot fi manipulate, de exemplu:

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

Această expresie este concepută pentru a obține parametrii într-un șir URL. La începutul rândului există un caracter special " ^ " - asta înseamnă începutul liniei. Urmează " /catalog/" - nu există caractere speciale aici, acesta este doar text care ar trebui să fie conținut în linie. Apoi am întâlnit paranteze, adică am ajuns la prima subexpresie. Parantezele pătrate indică multe caractere care pot fi în linie în acest loc. Semnul " - " înseamnă enumerare. Semn " \ " scapă caractere speciale. Astfel, în prima subexpresie putem avea MAJUSCULĂ și litere mici ale alfabetului latin, cifre de la 0 la 9, o liniuță de subliniere, o liniuță și un punct. O liniuță și un punct sunt caractere speciale, dar aici ele sunt scăpate, deci aici sunt doar simboluri după paranteze drepte există un semn ". + " - aceasta înseamnă că caracterul anterior (și pentru noi acesta este un set de caractere specificat între paranteze drepte) poate apărea de 1 sau mai multe ori. Apoi vine " / " este doar un simbol și o a doua subexpresie similară. Apoi vine " \.html„ce înseamnă textul” .html". Și apoi personaje speciale" .* „Un punct înseamnă orice caracter, iar un asterisc înseamnă orice cantitate din caracterul anterior. Adică după „ .html„Orice poate merge.

Indicarea cantității, cuantificatori

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

Personaje speciale

Există abrevieri speciale pentru unele grupuri de caractere:

"Lăcomie"

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

#()#

Citim: subexpresie:

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

Dar se potrivește și:

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

#()#U

Modificatori

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

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

php Funcții pentru lucrul cu expresii regulate

preg_replace

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

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

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

preg_split

Împarte un șir folosind o expresie regulată:

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

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

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! A fost găsită o potrivire. Răspuns: cuvântul „test” conține litera „e”.

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

Pentru ce sunt folosite expresiile regulate în PHP? În practica mea, expresiile regulate au fost folosite, de exemplu, pentru a determina dacă o adresă de e-mail a fost compusă corect. Astfel de expresii sunt folosite și pentru a determina corectitudinea numelui de utilizator și a parolei. Folosind expresii regulate, puteți găsi adresa într-un link și o puteți salva. Există multe lucruri pe care le puteți face Analizând acest lucru, puteți identifica funcția principală a expresiilor regulate și două secundare. 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
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ța minim un caracter apoi folosește „+” în loc de „*”

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

Să presupunem că trebuie să verificăm parola utilizatorului pentru corectitudine. Să ne gândim ce ar trebui să conțină parola utilizatorului? 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? Pentru că 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ă „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ă știț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!

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 adresele de e-mail în text”, „î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 câteva exemple simple. Prima expresie din imaginea de mai jos caută o secvență de 3 litere, unde prima literă este „k”, a doua este orice literă rusă și a treia este „t” insensibilă la majuscule (de exemplu, „pisica” sau „KOT ” se potrivește acestui tipar). A doua expresie caută în text ora în formatul 12:34.

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 urmează modelul șirului pe care îl căutăm, urmat de un al doilea delimitator, iar la sfârșit pot fi una sau mai multe litere de steag. Acestea specifică 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 este format din personaje 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”. Iată o listă completă de caractere speciale (în manualul php se numesc 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ă. PHP are o funcție specială preg_match($regexp, $text, $match) care preia expresii regulate, text și o matrice goală ca intrare. Verifică dacă textul conține un subșir care se potrivește cu modelul dat și returnează 0 dacă nu, sau 1 dacă există. Și prima potrivire găsită cu secvența obișnuită este plasată în matricea transmisă î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ă analizăm ce înseamnă diferitele tipuri de 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ă există un simbol ^ la începutul parantezelor pătrate, atunci sensul este inversat: „orice caracter, cu excepția celor indicați” - de exemplu [^a-c] înseamnă „orice caracter, cu excepția a, b sau c”.
  • Parantezele grupează caractere și expresii. De exemplu, în expresia abc+, semnul plus se referă numai 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 [а-яе].

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 .

Limbajul expresiei regulate necesită să scrieți o singură bară oblică inversă. Cu toate acestea, în șiruri între ghilimele simple și duble în PHP, backslash are și o semnificație specială: 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
  • \d caută orice cifră, \D - orice caracter, cu excepția unei cifre

\w se potrivește cu orice literă (din orice alfabet), număr sau liniuță de subliniere _ . \W se potrivește cu orice caracter, cu excepția unei litere, a unui număr sau a unei liniuțe de subliniere.

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