Acasă / Internet / Expresiile regulate PHP preg se potrivesc. Expresii regulate în php. Înlocuirea ghilimelelor duble cu ghilimele inteligente

Expresiile regulate PHP preg se potrivesc. Expresii regulate în php. Înlocuirea ghilimelelor duble cu ghilimele inteligente


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


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 în care aveți text (de exemplu, în Microsoft Word


) și trebuie să găsiți ceva important în el. Dacă știți exact ce căutați, totul este simplu: apelați dialogul de căutare, introduceți cuvântul de căutare, apăsați butonul și voila - textul este găsit. Dar ce vei face dacă știi doar dinainte tipul de informații pe care îl cauți? De exemplu, vă confruntați cu sarcina de a găsi toate adresele e-mail

într-un document de câteva sute de coli. Unii vor vizualiza documentul manual, alții vor introduce câinele (@) în căutare și îl vor căuta. De acord - ambele opțiuni sunt o muncă epuizantă, ingrată.

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.

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

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

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

Abvg ACZms

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.

Un cuantificator este un construct special care determină de câte ori trebuie să apară un caracter sau un grup de caractere. Cuantificatorul este scris între paranteze „()”. Sunt posibile două formate de înregistrare: precisă și gamă. Formatul exact 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 modificatorii. 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.

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

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

Funcția verifică dacă conținutul subiectului se potrivește cu modelul. Returnează 1 dacă 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ă.

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.
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 scopuri de instruire, recomand să instalați unul dintre programe speciale pentru testarea expresiilor regulate (de exemplu, „PCRE” sau „RegEx Builder”).

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

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

Pentru ce sunt folosite expresiile regulate în PHP? În practica mea, expresiile regulate au fost folosite, de exemplu, pentru a determina dacă o adresă de e-mail a fost compusă corect. Astfel de expresii sunt folosite și pentru a determina corectitudinea numelui de utilizator și a parolei. Folosind expresii regulate, puteți găsi adresa într-un link și o puteți salva. Există multe lucruri pe care le puteți face Analizând acest lucru, puteți identifica funcția principală a expresiilor regulate și două secundare. 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 acest caz, simbolul „/” simbolizează începutul și sfârșitul modelului 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 „[” „]”. Orice lucru inclus în aceste paranteze este definit ca un singur caracter, în acest caz caracterul 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ă cel puțin un caracter, atunci folosiți „+” î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 că întregul șir trebuie să se potrivească cu modelul. 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ă sări peste rânduri care nu conțin numere, și nu cele care conțin „O, Doamne, câte caractere 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 intrat în simbol, dar!

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

Cat despre seria de articole despre dezvoltarea unui blog cms, declar prima parte a seriei inchisa!

Expresiile regulate vă permit să găsiți secvențe într-un șir care se potrivesc cu un model. De exemplu, șablonul „Vasya(.*)Pupkin” vă va permite să găsiți o secvență atunci când există orice număr de caractere între cuvintele Vasya și Pupkin. Dacă trebuie să găsim șase cifre, atunci scriem „(6)” (dacă, de exemplu, de la șase la opt cifre, atunci „(6,8)”). Aceasta separă lucruri precum indicatorul setului de caractere și indicatorul numărului necesar:

În loc de un set de caractere, poate fi utilizată desemnarea oricărui caracter - poate fi specificat un punct specific (sunt acceptate secvențele - „0-9”) menționat. Poate indica „cu excepția acest set

personaje”. Numărul de caractere este numit „cuantificator” în documentația oficială PHP. Termenul este convenabil și nu implică neînțelegeri. Deci, un cuantificator poate avea fie o valoare specifică - fie o valoare fixă ​​(“(6)”), fie un interval numeric (“(6,8)”), fie un abstract „orice număr, inclusiv 0” (“( „ *”), „oricare număr natural

" - de la 1 la infinit ("+": "document+.txt"), "fie 0, fie 1" ("?"). Cuantificatorul implicit pentru acest set de caractere este unul ("document.txt").

Pentru o căutare mai flexibilă a combinațiilor, aceste legături „set de caractere - cuantificator” pot fi combinate în metastructuri.

Ca orice instrument flexibil, expresiile regulate sunt flexibile, dar nu absolut: domeniul lor de aplicare este limitat. De exemplu, dacă trebuie să înlocuiți un șir fix din text cu altul, unul fix din nou, utilizați str_replace. Dezvoltatorii PHP vă roagă în lacrimi să nu utilizați funcțiile complexe ereg_replace sau preg_replace în acest scop, deoarece atunci când sunt apelate, are loc procesul de interpretare a șirurilor, iar acest lucru consumă serios resursele sistemului. Din păcate, acesta este un rake favorit al programatorilor PHP începători. Folosiți funcții de expresie regulată numai dacă nu știți exact ce șir există. Exemple: cod de căutare în care caracterele de serviciu și cuvintele scurte sunt tăiate din șirul de căutare, precum și spațiile suplimentare sunt decupate (sau mai degrabă, toate spațiile sunt comprimate: „+” este înlocuit cu un spațiu). Folosind aceste funcții, verific e-mailul utilizatorului care își lasă recenzia. Se pot face multe, dar este important să rețineți că expresiile regulate nu sunt atotputernice. De exemplu, o substituție complexă în E mai bine să nu le faci. La urma urmei, de exemplu, combinația „(.*)” în termenii programului înseamnă căutarea prin toate caracterele textului. Și dacă șablonul nu este legat de începutul sau sfârșitul liniei, atunci șablonul în sine este „mutat” de program prin întregul text, iar rezultatul este căutare dublă, sau mai degrabă căutare pătrat. Nu este greu de ghicit că o altă combinație „(.*)” înseamnă iterare peste un cub și așa mai departe. Ridicați, să zicem, 5 kiloocteți de text la a treia putere. Se dovedește 125.000.000.000 (în cuvinte: o sută douăzeci și cinci de miliarde de operațiuni). Desigur, dacă adoptați o abordare strictă, nu vor fi atât de multe operații, ci de patru până la opt ori mai puține, dar ordinea numerelor în sine este importantă.

Set de caractere
. punctorice personaj
[] paranteze pătrateclasa de caractere ("oricare dintre"). De exemplu
[^] clasa de caractere negative ("oricare cu excepția")
- liniuțădesemnarea secvenței într-o clasă de caractere ("" cifre)
\d Numai numere
\D[^0-9] Pe lângă numere
\w Litere și cifre
\W[^a-z0-9]Pe lângă litere și cifre
\s Caractere cu spații albe: spațiu, tab, linie nouă
\S[^ ] Cu excepția caracterelor cu spații albe
| (unul|altul)În acest loc poate exista una dintre opțiunile enumerate, de exemplu: (Vasya|Petya|Masha). Dacă nu doriți să fie inclus în selecție, utilizați (?: ...)

Nu folosiți o clasă de caractere pentru a desemna doar unul (în loc de „+" „+” va fi bine). Nu scrieți un punct în clasa de caractere; acesta este orice caracter, atunci alte caractere din clasă vor fi pur și simplu de prisos (și în clasa negativă aceasta va avea ca rezultat negarea tuturor caracterelor).

Cuantificator

Un cuantificator poate indica atât o valoare specifică, cât și limite. Dacă numărul dat se încadrează în limitele cuantificatorului, se consideră că fragmentul de expresie se potrivește cu șirul care este analizat. Sintaxă:

{ }

{ , }

Dacă trebuie să indicați doar minimul necesar, dar nu există maxim, pur și simplu puneți o virgulă și nu scrieți al doilea număr: „(5,)” (“minimum 5”). Există notații speciale pentru cuantificatorii cel mai des utilizați:

În practică, astfel de simboluri sunt folosite mai des decât bretele.

Ancore

Aceste personaje trebuie să apară chiar la începutul și, respectiv, la sfârșitul rândului.

Lăcomia Semnul întrebării acționează și ca un minimizator de cuantificator:
.*?

Rezultatul exemplului: Versiune greedy: text îngroșat [b]și aici - și mai îndrăzneț returnat Versiunea leneșă: text îngroșat [b]și aici - și mai îndrăzneț returnat

Linia șablonului, așa cum ați observat deja, începe și se termină cu bare oblice. După al doilea există parametri:

icăutare fără majuscule
m

modul multilinie. În mod implicit, PCRE caută doar potriviri de model într-o singură linie, iar caracterele „^” și „$” se potrivesc doar la începutul și la sfârșitul întregului text.

sCând această opțiune este setată, „^” și „$” se potrivesc cu începutul și sfârșitul liniilor individuale.
simbolul "." (punct) se potrivește și întreruperea de linie (nr implicit)O
ancora la începutul textuluiE
Uforțează caracterul „$” să se potrivească numai la sfârșitul textului.
Ignorat dacă parametrul m este setat.Inversează „greedy” pentru fiecare cuantificator (dacă un cuantificator este urmat de „?”, acel cuantificator nu mai este „greedy”).
e
  • Șirul de înlocuire este interpretat ca cod PHP.
  • Funcții pentru lucrul cu expresii regulate preg_grep preg_match - Efectuează o verificare a potrivirii
  • expresie regulată
  • . Această funcție caută doar primul meci! preg_match_all preg_quote - Escape caractere din expresiile regulate.
  • Aceste. inserează bare oblice înaintea tuturor caracterelor de serviciu (de exemplu, paranteze,
  • paranteze pătrate
  • etc.) astfel încât să fie luate la propriu. Dacă aveți vreo intrare de utilizator și o verificați folosind expresii regulate, atunci este mai bine să scăpați de caracterele de serviciu din variabila de intrare înainte de a face acest lucru
preg_replace

preg_replace_callback - Efectuează căutarea și înlocuirea expresiilor regulate

preg_split

preg_grep

Funcția preg_grep - Returnează o serie de apariții care se potrivesc cu un model

Sintaxă

matrice preg_grep (model șir, intrare matrice [, steaguri int])
preg_grep() returnează o matrice formată din elemente ale matricei de intrare care se potrivesc cu modelul dat. Parametrul flags poate lua următoarele valori: PREG_GREP_INVERT
Dacă acest flag este setat, funcția preg_grep() le returnează
elemente de matrice

, care nu se potrivesc cu modelul dat.

Rezultatul returnat de preg_grep() folosește aceiași indecși ca și matricea de date originală. Dacă acest comportament nu vi se potrivește, utilizați array_values() pe matricea returnată de preg_grep() pentru a reindexa.

Exemplu de cod:

preg_split

// Returnează toate elementele matricei // care conțin numere în virgulă mobilă $fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);

preg_match Funcția preg_match - Efectuează o potrivire cu o expresie regulată potrivirile sunt specificate, acesta va fi completat cu rezultatele căutării. Elementul $matches va conține porțiunea șirului care se potrivește cu întregul model, $match va conține porțiunea șirului care se potrivește cu primul submodel și așa mai departe.

steagurile pot lua următoarele valori:

PREG_OFFSET_CAPTURE

Căutarea se efectuează de la stânga la dreapta, de la începutul liniei. Parametrul opțional de offset poate fi utilizat pentru a specifica o poziție alternativă de pornire pentru căutare. Un rezultat similar poate fi obținut prin înlocuirea subiectului cu substr())($subiect, $offset).

Funcția preg_match() returnează numărul de potriviri găsite. Acesta poate fi 0 (nu au găsit potriviri) și 1, deoarece preg_match() nu mai funcționează după prima potrivire găsită. Dacă trebuie să găsiți sau să numărați toate potrivirile, ar trebui să utilizați funcția preg_match_all(). Funcția preg_match() returnează FALSE dacă apar erori în timpul execuției.

Recomandare: Nu utilizați funcția preg_match() dacă trebuie să verificați prezența unui subșir într-un șir dat. Utilizați strpos() sau strstr() pentru aceasta deoarece vor face treaba mult mai repede.

Exemplu de cod Exemplu de cod Exemplu de cod Rezultatul exemplului:

numele de domeniu este: site

preg_match_all

Funcția preg_match_all - Efectuează o căutare globală de model într-un șir

preg_split

int preg_match_all (model șir, subiect șir, matrice potrivește [, int flags [, int offset]])

Caută în subiectul șirului toate potrivirile modelului de model și plasează rezultatul în matricea de potriviri în ordinea determinată de combinația de steaguri.

După găsirea primei potriviri, căutările ulterioare vor fi efectuate nu de la începutul șirului, ci de la sfârșitul ultimei apariții găsite.

Parametrul opțional de steaguri poate combina următoarele valori (rețineți că utilizarea PREG_PATTERN_ORDER în același timp cu PREG_SET_ORDER nu are sens):

PREG_PATTERN_ORDER
Dacă acest flag este setat, rezultatul va fi ordonat după cum urmează: elementul $potriviri conține o matrice de apariții complete ale modelului, elementul $potriviri conține o matrice de apariții ale primului submodel și așa mai departe.

Exemplu de cod Rezultatul exemplului: exemplu: , acesta este un exemplu de testare: , acesta este un test

După cum putem vedea, $out conține o matrice de apariții complete ale modelului, iar elementul $out conține o matrice de subșiruri conținute în etichete.

PREG_SET_ORDER
Dacă acest indicator este setat, rezultatul va fi ordonat după cum urmează: elementul $potriviri conține primul set de apariții, elementul $potriviri conține al doilea set de apariții și așa mai departe.

Exemplu de cod Rezultatul exemplului: exemplu: , exemplu: acesta este un test, acesta este un test

În acest caz, matricea $potriviri conține primul set de potriviri, și anume: elementul $potriviri conține prima apariție a întregului model, elementul $potriviri conține prima apariție a primului subpattern și așa mai departe. În mod similar, tabloul $matches conține al doilea set de potriviri și așa mai departe pentru fiecare potrivire găsită.

PREG_OFFSET_CAPTURE
Dacă este specificat acest flag, pentru fiecare subșir găsit va fi indicată poziția sa în șirul sursă. Este important de reținut că acest flag modifică formatul datelor returnate: fiecare apariție este returnată ca un tablou, al cărui element zero conține subșirul găsit, iar primul element conține offset.

În cazul în care nu se folosește niciun semnal, valoarea implicită este PREG_PATTERN_ORDER.

Căutarea se efectuează de la stânga la dreapta, de la începutul liniei. Parametrul opțional de offset poate fi utilizat pentru a specifica o poziție alternativă de pornire pentru căutare. Un rezultat similar poate fi obținut prin înlocuirea subiectului cu substr())($subiect, $offset).

Returnează numărul de apariții ale modelului găsit (poate fi zero) sau FALSE dacă au apărut erori în timpul execuției.

Exemplu de cod Exemplu de cod Rezultatul exemplului: potrivit: text aldin partea 1: partea 2: text aldin partea 3: potrivit: click pe mine partea 1: partea 2: dați clic pe mine partea 3: preg_quote

Funcția preg_quote - Escape caractere din expresiile regulate

preg_split

string preg_quote (string str [, string delimiter])

Funcția preg_quote() preia șirul str și adaugă o bară oblică inversă înaintea fiecărui caracter special. Acest lucru poate fi util dacă șablonul implică variabile șir, a căror valoare se poate modifica în timpul funcționării scriptului.

Dacă este specificat parametrul delimitator suplimentar, acesta va fi, de asemenea, scapat. Acest lucru este util pentru evadarea unui limitator care este utilizat în funcțiile PCRE. Cel mai comun delimitator este caracterul „/”.

În expresiile regulate, următoarele caractere sunt considerate caractere de serviciu: . \\ + * ? [ ^ ] $ () ( ) = !< > | :

Exemplu de cod Exemplu de cod Rezultatul exemplului: Această carte este *foarte* greu de găsit. preg_replace

Funcția preg_replace - Efectuează căutarea și înlocuirea folosind o expresie regulată

preg_split

mixed preg_replace (model mixt, înlocuire mixtă, subiect mixt [, limită int])

Caută în subiectul șirului potriviri de model și le înlocuiește cu înlocuire. Dacă este specificat parametrul limită, aparițiile limită ale șablonului vor fi înlocuite; dacă limita este omisă sau este egală cu -1, toate aparițiile modelului vor fi înlocuite.

Înlocuirea poate conține referințe de forma \\n sau (din PHP 4.0.4) $n, cea din urmă fiind de preferat. Fiecare astfel de referință va fi înlocuită cu un subșir corespunzător celui de-al n-a submodel cuprins între paranteze n poate lua valori de la 0 la 99, cu referința \\0 (sau $0) corespunzătoare unei apariții a întregului model numerotate de la stânga la dreapta, începând cu unu .

Când folosiți înlocuirea wildcard folosind referințe de submodel, poate apărea o situație în care masca este imediat urmată de un număr. În acest caz, notația ca \\n are ca rezultat o eroare: o referință la primul submodel urmată de numărul 1 va fi scrisă ca \\11, care va fi interpretată ca o referință la al unsprezecelea submodel. Această neînțelegere poate fi eliminată folosind construcția \$(1)1, care indică o referință izolată la primul submodel urmată de cifra 1.

Exemplu de cod

Rezultatul acestui exemplu va fi:

Dacă se găsește o potrivire de tipar în timpul execuției funcției, valoarea subiectului modificată va fi returnată, în caz contrar subiectul original va fi returnat.

Primii trei parametri ai preg_replace() pot fi tablouri unidimensionale. În cazul în care matricea folosește chei, la procesarea matricei acestea vor fi preluate în ordinea în care sunt amplasate în matrice. Specificarea cheilor din matrice pentru model și înlocuire este opțională. Dacă decideți să utilizați indecși pentru a se potrivi cu modelele și șirurile implicate în înlocuire, utilizați funcția ksort() pe fiecare dintre matrice.

Ursul negru a sărit încet peste câinele leneș.

Folosind ksort() obținem rezultatul dorit:

Ursul negru lent a sărit peste câinele leneș.

Dacă parametrul subiect este o matrice, căutarea și înlocuirea modelului sunt efectuate pentru fiecare dintre elementele sale. Rezultatul returnat va fi, de asemenea, o matrice.

Dacă modelul și parametrii de înlocuire sunt matrice, preg_replace() preia alternativ o pereche de elemente din ambele matrice și le folosește pentru operația de căutare și înlocuire. Dacă matricea de înlocuire conține mai multe elemente decât model, vor fi luate șiruri goale pentru a înlocui elementele lipsă. Dacă modelul este un tablou și înlocuirea este un șir, fiecare element al matricei de model va fi căutat și înlocuit cu model (toate elementele matricei vor fi modelul la rândul lor, în timp ce șirul de înlocuire rămâne fix). Opțiunea când modelul este un șir și înlocuirea este o matrice nu are sens.

Modificatorul /e modifică comportamentul funcției preg_replace() în așa fel încât parametrul de înlocuire, după efectuarea înlocuirilor necesare, este interpretat ca cod PHP și abia apoi este folosit pentru înlocuire. Când utilizați acest modificator, aveți grijă: parametrul de înlocuire trebuie să conțină cod PHP valid, altfel va apărea o eroare de sintaxă în linia care conține apelul funcției preg_replace().

Exemplu de cod: înlocuiți cu mai multe modele

Acest exemplu va scoate:

$startDate = "27/5/1999";

Exemplu de cod: Folosind modificatorul /e Exemplu de cod: Convertește toate etichetele HTML în majuscule preg_replace_callback

Funcția preg_replace_callback - Efectuează căutarea și înlocuirea expresiilor regulate folosind o funcție de apel invers

preg_split

mixed preg_replace_callback (model mixt, apel invers apel, subiect mixt [, limită int])

Comportamentul acestei funcții este în multe privințe similar cu preg_replace(), cu excepția faptului că, în loc de parametrul de înlocuire, trebuie să specificați o funcție de apel invers, căreia îi este transmisă o serie de apariții găsite ca parametru de intrare. Rezultatul așteptat este șirul care va fi înlocuit.

Exemplu de cod (.*?).")", $xml, $match, PREG_PATTERN_ORDER);

returnează $match-uri; )

Căutați etichete XHTML/XML cu o anumită valoare de atribut

Această funcție este foarte asemănătoare cu cea anterioară, cu excepția faptului că puteți da etichetei atributul dorit. De exemplu, puteți găsi cu ușurință.

Funcția get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ attr); $value = preg_quote($tag_regex = "/]*$attr\s*=\s*)$value\\2[^>]*>( .*?)/" preg_match_all($tag_regex, $xml, $match, PREG_PATTERN_ORDER); returnează $match; )

Un alt instrument util pentru dezvoltatorii web! Vă permite să găsiți/verificați valorile de culoare hexazecimale.

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $șir)) ( echo "exemplul 6 cu succes."; )

Căutați titlul articolului

Acest fragment de cod va găsi și afișa textul din interiorul etichetelor pe o pagină html.

$fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp))( $pagina .= fgets($fp, 4096); ) $titre = eregi("(.*)",$pagina,$regs); echo $regs; fclose($fp);

Analizarea jurnalelor Apache

Majoritatea site-urilor rulează pe binecunoscutul server web Apache. Dacă site-ul tău este unul dintre ele, de ce să nu folosești PHP și expresii regulate pentru a analiza jurnalele Apache?

//Jurnale: server web Apache //Accesări reușite numai la fișierele HTML. Util pentru numărarea numărului de vizualizări ale paginilor. „^((?#IP client sau nume de domeniu)S+)s+((?#autentificare de bază)S+s+S+)s+[((?#date și oră)[^]]+)]s+”(?: GET|POST|HEAD) ((?#fișier)/[^ ?]+?.html?)??((?#parametri)[^ ?]+)? HTTP/+"s+(?#codul de stare)200s+((?#bytes transfered)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent) )[^"]*)"$" //Înregistrări: server web Apache //doar erori 404 "^((?#IP client sau nume de domeniu)S+)s+((?#autentificare de bază)S+s+S+) s+[((?#data si ora)[^]]+)]s+"(?:GET|POST|HEAD) ((?#fisier)[^ ?"]+)??((?#parametri)[ ^ ?"]+)? HTTP/+"s+(?#codul de stare)404s+((?#bytes transfered)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent) )[^"]*)"$"

Înlocuirea ghilimelelor duble cu ghilimele inteligente

Dacă sunteți un pasionat de tipografie, vă va plăcea această expresie regulată care înlocuiește ghilimele duble obișnuite cu ghilimele inteligente. O expresie regulată similară este utilizată în WordPress în conținutul paginii.

Preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $text);

Verificare completă a parolei

Această expresie regulată se va asigura că în câmpul de text sunt introduse cel puțin șase caractere, numere, cratime și caractere de subliniere.

Câmpul de text trebuie să conțină cel puțin un caracter majuscule, un caracter mic și un număr.

„A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

WordPress: Utilizarea expresiei regulate pentru a obține imagini dintr-o postare

Deoarece mulți dintre voi sunteți utilizatori WordPress, este posibil să aveți nevoie de un cod care vă permite să obțineți toate imaginile din textul unui articol și să le afișați.

Pentru a utiliza acest cod, pur și simplu lipiți-l în orice fișier din tema dvs.