Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Programi
  • Regularni izrazi u php-u. Regularni izrazi (uzorci)

Regularni izrazi u php-u. Regularni izrazi (uzorci)


Jedan od vrlo moćnih i korisne značajke PHP jezik - podrška za regularne izraze. Mnogi programeri, i početnici i prilično iskusni, zastrašeni su očiglednom složenošću i zamršenošću jezika regularnih izraza. Ali mogu vas uvjeriti - isplati se. Korištenje regularnih izraza uvelike pojednostavljuje rad obrade tekstova i slabo strukturiranih podataka.


Regularni izrazi- To su izrazi napisani posebnim jezikom. Nemojte se uznemiriti, jezik je prilično jednostavan za razumijevanje; sve što trebate je iskustvo i praksa.


Mislim da ste se više puta susreli sa situacijama u kojima imate tekst (na primjer, u Microsoft Word) i u njemu morate pronaći nešto važno. Ako znate što točno tražite, sve je jednostavno: pozovite dijaloški okvir za pretraživanje, unesite riječ za pretraživanje, pritisnite gumb i voila - tekst je pronađen.


Ali što ćete učiniti ako unaprijed znate samo vrstu informacije koju tražite? Na primjer, suočeni ste sa zadatkom da pronađete sve adrese E-mail u dokumentu od par stotina listova. Neki će pregledati dokument ručno, neki će unijeti psa (@) u pretragu i tražiti ga. Slažem se - obje opcije su naporan, nezahvalan posao.

Ovdje regularni izrazi dolaze u pomoć. U određenoj mjeri, regularni izrazi mogu se usporediti s maskama ili predlošcima koji su postavljeni na tekst: ako tekst odgovara maski, onda je to željeni fragment. Ali prije nego što razmotrimo korištenje regularnih izraza, upoznat ćemo se s njihovom sintaksom.

Regularni izraz je tekstualni niz sastavljen prema određenim zakonima i pravilima. Niz se sastoji od znakova i grupa znakova, metakaraktera, kvantifikatora i modifikatora.

Pod simbolima u u ovom slučaju razumiju se svi simboli bilo koje abecede. I ne samo one čitke. Možete vrlo lako umetnuti nečitljiv znak u izraz; samo trebate znati njegov heksadecimalni oblik. Na primjer:

// čitljivi znakovi a E // nečitljivi znakovi i kodovi \x41 - isto što i slovo "A" \x09 - znak kartice

Grupa znakova je nekoliko znakova napisanih u nizu:

Abvg ACZms

Dopustite mi da vam odmah skrenem pozornost na činjenicu da se "prostor" u regularnim izrazima također smatra značajan simbol, stoga budite oprezni pri pisanju izraza. Na primjer, ove grupe znakova su RAZLIČITI izrazi:

ABC GDJE ABC GDJE

Sljedeći element jezika su metakarakteri. Prefiks "meta" znači da ti simboli opisuju neke druge simbole ili njihove skupine. Tablica opisuje glavne metakaraktere jezika regularnih izraza:

Metaznakovi za zadatak posebni znakovi
() Zagrade. Definira ugniježđene izraze.
| Metaznak odabira
^ Metaznak početka retka
$ Metaznak kraja retka
\n Znak za novi redak (heks kod 0x0A)
\r Povratni znak (heksadecimalni kod 0x0D)
\t Tab znak (heks kod 0x09)
\xhh Umetanje znaka s heksadecimalnim kodom 0xhh, na primjer \x42 umetnut će latinično slovo "B"
Metaznakovi za određivanje grupa znakova
. Točka. Bilo koji lik.
\d Znamenka (0-9)
\D Nije broj ( bilo koji lik osim znakova 0-9)
\s Prazan znak (obično razmaknica i tabulator)
\S Znak koji nije prazan (svi osim znakova identificiranih metakarakterom \s)
\w Znak "rječnika" (znak koji se koristi u riječima. Obično sva slova, svi brojevi i podvlaka ("_"))
\W Sve osim znakova definiranih metaznakom \w

Metaznakove iz druge polovice tablice vrlo je lako zapamtiti. "d" - znamenka (cifra), "s" - simbol (simbol), "w" - riječ (riječ). Ako je slovo veliko, morate dodati "NE" u opis grupe.

Uzmimo za primjer tekst "Crveni dres ima brojeve 1812, a zeleni dres ima brojeve 2009." Pogledajmo primjere najjednostavnijih regularnih izraza:

\d\d\d\d - pronaći će 1812 i 2009 \D - pronaći će sva slova, razmake i interpunkcijske znakove \s - pronaći će sve razmake u tekstu.

Ali godina u našem primjeru može biti napisana ne s četiri, već s dvije znamenke, riječi mogu imati druge deklinacije itd. Ovdje mogu pomoći podskupovi znakova koji su navedeni uglatim zagradama:

Označava bilo koju znamenku (isto kao \d) - znači parnu znamenku - znači bilo koji simbol latinične abecede (u svakom slučaju) ili znamenku.

Na primjer, izraz \d\d\d u testnom nizu pronaći će samo 1812, ali ne i 2009. Ovaj izraz treba čitati kao "pronađi sve nizove od četiri znamenke gdje je zadnja znamenka 0,2,4,6 ili 8."

Sve što nam je ostalo za spomenuti su kvantifikatori i modifikatori.

Kvantifikator je posebna konstrukcija koja određuje koliko se puta lik ili grupa znakova mora pojaviti. Kvantifikator je napisan u vitičastim zagradama "()". Moguća su dva formata snimanja: precizno i ​​opseg. Točno format je napisan ovako:

Ovdje je X broj ponavljanja prethodnog simbola ili grupe. Na primjer izraz

Drugi oblik snimanja je raspon. Zapisano kao

(X, Y) // ili (,Y) // ili (X,)

gdje je X minimum, a Y je maksimalni iznos ponavljanja. Na primjer:

čitati kao "dvije do četiri znamenke napisane u nizu." Ako jedna od granica nije navedena, tada se ne pretpostavlja nikakvo ograničenje. Na primjer:

\w(3,) - tri ili više slova. \d(,5) - brojeva uopće nema ili ih ima, ali ne više od pet.

Kvantifikatori se mogu primijeniti ili na jedan znak ili na grupu:

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

Ova konstrukcija će iz teksta odabrati sve ruske riječi od jedne, dvije ili tri slova(na primjer, "ili", "ne", "ja", "idem" itd.)

Osim vitičastih zagrada, postoje još tri metakaraktera kvantifikatora: “*” (zvjezdica), “+” (plus) i “?” (pitanje). Koriste se u slučajevima kada je minimalni i maksimalni broj potrebnih ponavljanja unaprijed nepoznat. Na primjer, kada tražite adrese e-pošte, ne možete unaprijed odrediti koliko će znakova biti u korisničkom imenu (ispred "pas"), a koliko će biti u nazivu domene (nakon "pas").

Metaznak "*" čita se kao "bilo koji iznos od nula ili više", tj. oblikovati

definira bilo koji broj uzastopnih slova, uključujući njihovu potpunu odsutnost.

Simbol "+" razlikuje se od zvjezdice samo po tome što zahtijeva najmanje jedan znak. Oni. oblikovati

odgovara bilo kojem digitalnom nizu s jednom ili više znamenki.

Simbol "?" odgovara odsutnosti ili prisutnosti jednog znaka. Oni. oblikovati

odgovara bilo kojem digitalnom nizu s jednom ili dvije znamenke.

Ovdje je vrijedno spomenuti takvu značajku antiifikatora "*" i "+" kao pohlepa. Stvar je u tome da ti znakovi prema zadanim postavkama odgovaraju najdužem mogućem nizu znakova. Na primjer, za redak "mama je oprala okvir" izraz:

izabrat će “mama soap ra”, što je pomalo neočekivano, jer smo očekivali da ćemo dobiti “ma”. Za promjenu ovog ponašanja upotrijebite metaznak "?" (upitnik) napisan neposredno iza kvantifikatora. Ograničava "apetit" kvantifikatora prisiljavajući ih da vrate prvo podudaranje umjesto najduljeg. Sada promijenimo prethodni primjer:

i dobiti traženo podudaranje "ma".

Posljednji element jezika je modifikatori. Modifikator je poseban znak koji definira parametre "sustava" za analizu regularnih izraza. Postoje samo četiri takva simbola, mogu se koristiti pojedinačno ili istovremeno:

ja Omogućuje način rada koji ne razlikuje velika i mala slova, tj. velika i mala slova ne razlikuju se u izrazu.
m Označava da se tekst koji se pretražuje treba tretirati kao da se sastoji od više redaka. Prema zadanim postavkama mehanizam regularnih izraza tretira tekst kao jedan niz, bez obzira što on zapravo jest. Sukladno tome, metaznakovi "^" i "$" označavaju početak i kraj cijelog teksta. Ako je ovaj modifikator naveden, tada će označavati početak i kraj svakog retka teksta.
s Zadani metaznak je "." ne uključuje znak novog retka u svojoj definiciji. Oni. Za višeredni tekst izraz /.+/ će vratiti samo prvi red, a ne cijeli tekst kao što se očekuje. Navođenje ovog modifikatora uklanja ovo ograničenje.
U Čini sve kvantitativne metaznakove "nepohlepnima" prema zadanim postavkama. U nekim modifikacijama jezika (osobito u PHP-u), umjesto "U", koristi se znak "g", što je dosljednije značenju ("g" je skraćenica za engleski "pohlepan", "pohlepan" ).

Tablica prikazuje najpopularnije i potrebni primjeri regularni izrazi. Neki od njih mogu vam se činiti kompliciranima i nezgrapnima, ali uz detaljno proučavanje nedvojbeno ćete ih razumjeti.

Regularni izrazi u PHP-u.

Za rad s regularnim izrazima u PHP-u postoje posebne funkcije čiji popis Kratki opis dati su u tabeli:

int preg_match (uzorak niza, predmet niza [, podudaranje niza])

Funkcija provjerava odgovara li sadržaj predmeta uzorku uzorka. Vraća 1 ako se pronađu podudaranja, inače vraća 0. Ako nije navedeno traženi parametar-matches niz, tada kada se funkcija izvrši, jedan element će biti unesen u njega - prvo pronađeno podudaranje.

"; print_r($pronađeno); ?>

int preg_match_all (uzorak niza, predmet niza, podudaranje niza [, int poredak])
Funkcija je identična prethodnoj, s jedinom razlikom - pretražuje cijeli tekst i vraća SVA podudaranja pronađena u nizu podudaranja.
mixed preg_replace (mješoviti uzorak, miješana zamjena, miješani subjekt [, int limit])
Kao i obje funkcije prethodnika, preg_replace traži dio teksta koji odgovara uzorku. Funkcija zamjenjuje sve pronađene fragmente tekstom navedenim u parametrima.Prije čišćenja:\n$tekst\n\n"; $tekst = preg_replace("/(\n \s(2,))/"," ",$tekst); echo " Nakon čišćenja:\n$tekst"; // prikazat će tekst očišćen od posebnih znakova // i dodatnih razmaka?>
mixed preg_replace_callback (mješoviti uzorak, miješani povratni poziv, miješani predmet [, int limit])
Funkcija je proširena verzija prethodne. Glavna razlika je u tome što se ovoj funkciji u parametrima prosljeđuje naziv funkcije koja će analizirati tekst i generirati zamjenski tekst.
niz preg_split (uzorak niza, predmet niza [, ograničenje int [, zastavice int]])
Ova je funkcija slična funkcijama explode() i split(). Njegova je posebnost da separator nije fiksni niz, već regularni izraz. Funkcija dijeli izvorne podatke na elemente i postavlja ih u izlazni niz.
polje preg_grep (uzorak niza, unos polja)
Funkcija je dizajnirana za redovito pretraživanje nizova. Za pretraživanje se zadaju predložak i polje ulaznih podataka, a vraća se polje koje se sastoji samo od elemenata koji odgovaraju predlošku.

Popis razmatranih funkcija je daleko od potpunog, ali je sasvim dovoljan za uspješan početak rada s regularnim izrazima. Ako vas zanima ova tema, svakako pročitajte Daljnje čitanje(na primjer, Friedlova knjiga "Regularni izrazi"). Osim toga, u svrhu obuke, preporučujem instaliranje jednog od posebni programi za testiranje regularnih izraza (na primjer, "PCRE" ili "RegEx Builder").

Počnimo s time što je regularni izraz. Dakle, odgovorite mi na ovo pitanje: postoji li "e" u riječi "test"? "Jesti!" Ti kažeš. Onda vas pitam drugo pitanje, kako ste pronašli slovo "e" u riječi "test"? Odgovor je očigledan, uzmemo prvi znak, odnosno "t" i usporedimo ga s onim što tražimo, odnosno s "e". Ako nisu jednaki, onda uzmemo drugi znak, to jest "e", i usporedimo ga s onim što tražimo, to jest "e". Voila! Podudaranje je pronađeno. Odgovor: Riječ "test" sadrži slovo "e".

Sada mi odgovorite na još jedno pitanje, gdje je regularni izraz u ovom primjeru? Nadam se da ste pogodili da je ovdje uobičajeni izraz ono što tražimo u riječi "test". Odnosno slovo "e" u u ovom primjeru a postoji i regularni izraz.

Za što se regularni izrazi koriste u PHP-u? U mojoj praksi regularni izrazi korišteni su, na primjer, da se utvrdi je li adresa e-pošte ispravno sastavljena. Takvi se izrazi također koriste za utvrđivanje ispravnosti korisničkog imena i lozinke. Pomoću regularnih izraza možete pronaći adresu u poveznici i spremiti je. Mnogo je stvari koje možete učiniti Analizirajući ovo, možete identificirati glavnu funkciju regularnih izraza i dvije sporedne. Glavna funkcija , ovo je traženje podudaranja u nizu. Nuspojave uključuju spremanje pronađenih podudaranja i njihovu zamjenu.

Prvi regularni izraz

U teoriji razumijemo kako pronaći znak "e" u riječi "test", ali kako se to provodi u praksi? Za korištenje regularnih izraza u php-u obično se koriste sljedeće funkcije:

preg_match("regularni izraz (uzorak)", "varijabla u kojoj se vrši pretraga", "Varijabla u kojoj se sprema rezultat pretrage (neobavezni parametar)"); - Funkcija podudaranja
preg_replace("regularni izraz (uzorak)", "Čime zamijeniti pronađeno podudaranje", "varijabla u koju se vrši zamjena"); - Funkcija zamjene

Počnimo koristiti ove funkcije Evo primjera traženja znaka "e" u riječi "test":

$a = "test";
if(preg_match("/e/",$a)) echo "pronađeno!!";

Kod opisuje uvjet: ako je u varijabli $a pronađeno nešto što odgovara uzorku, tada se prikazuje poruka "pronađeno!!" Kao što ste možda primijetili, naš se predložak nalazi između dva "/". U ovom slučaju simbol "/" simbolizira početak i kraj našeg obrasca. Nadam se da je ovo jasno.

Sve je ovo zanimljivo, naravno... ali naš predložak je vrlo jednostavan, zar ne? Uostalom, rijetko trebamo pronaći neki simbol u varijabli. U većini slučajeva moramo pronaći mnoge likove, a također i nepoznate. Kako biti? Postavimo si problem i pokušajmo ga riješiti. Pretpostavimo da imamo niz koji se sastoji od brojeva i jednog nepoznatog engleskog slova

Kako pronaći ovo pismo? Može postojati bilo koje slovo engleske abecede, pa kako ga možete identificirati? Sami ste odgovorili na svoje pitanje, postoji bilo koje slovo, odnosno u rasponu je od a do z. Raspone možete koristiti u regularnim izrazima. Ako ne znamo koji znak tražimo, ali znamo sigurno da je taj znak slovo engleske abecede, tada će unos biti sljedeći:

$a = "123a321";
if(preg_match("//",$a)) echo "pronađeno!!";

Imajte na umu da je raspon zatvoren u zagradama "[" "]". Sve što je u takvim zagradama definirano je kao jedan simbol, u ovom slučaju simbol se kreće od a do z. Ako ne trebamo pronaći slovo, već broj, tada će unos biti ovakav:

$a = "abc1cba";
if(preg_match("//",$a)) echo "pronađeno!!";

Također želim napomenuti da regularni izrazi razlikuju velika i mala slova, tako da su znakovi "A" i "a" potpuno različiti, da tražite oba znaka, napišite ovako:

$a = "123a321";
if(preg_match("//",$a)) echo "pronađeno!!";

Postoji i pretraga za ruskim slovima, koja se provodi na isti način kao i za engleska:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "pronađeno!!";

Metakarakteri

Naučili smo kako tražiti nepoznati znak u nizu. Što učiniti ako trebamo pronaći nekoliko likova? U pomoć priskaču takozvani metasimboli... Pretpostavimo da imamo niz s brojevima i slovima, kako to opisati u predlošku? Možeš ti to:

linija - 123a321
uzorak -

Hmm... predložak zapravo odgovara našem nizu, a kada se provjeri usklađenost, dat će dugo očekivanu istinu! Ali to je pomalo glomazan zapis, zar ne?

Evo kako ga skratiti:

linija - 123a321
uzorak - *

Čini mi se da je kraći. Što je simbol "*"? Ovo je isti metasimbol, što znači da se simbol koji smo opisali (naime, simbol koji može sadržavati brojeve od 0 do 9 ili slova engleske abecede, od a do z) može ponavljati neograničeno dugo, ili više puta. Da da! Ovaj metasimbol će pronaći podudaranje u praznoj varijabli, budući da će čak i odsutnost simbola koji smo opisali vratiti true! Zapamtite ovo

Koji još metakarakteri postoje?

Na primjer, metaznak "+" Gotovo je sličan metaznaku "*" s jednom malom iznimkom. "*" će vratiti true čak i ako nema znaka, a "+" će provjeriti prisutnost barem jednog znaka. Odnosno, ako linija zahtijeva prisutnost minimum jedan znak zatim koristite "+" umjesto "*"

Često se koristi i metaznak "?". To znači da redak ne smije sadržavati više od jednog željenog znaka. Dopustite mi da dam nekoliko primjera za zadnja dva metakaraktera koja sam opisao.

Pretpostavimo da trebamo provjeriti točnost korisničke lozinke. Razmislimo što bi trebala sadržavati korisnička lozinka? Pa, prvo, mora biti barem jedan lik. Drugo, mora sadržavati samo brojeve i slova engleske abecede, tako da će regularni izraz izgledati ovako:

$a = "qwerty12345";

Koje likove dopuštamo? engleska slova bilo koji registar i brojeve. Sada pokušajte ostaviti prazan redak umjesto lozinke.

$a = "";
if(preg_match("/+/",$a)) echo "Lozinka je ispravna";

Nećete vidjeti poruku "Lozinka je točna". Zašto? Budući da je metaznak "+" provjeravao niz da vidi ima li barem jedan znak.

A sada mali trik, pogledajmo naš izraz, nismo dopustili, pa, recimo razmak u njemu, zar ne? stavite razmak na kraju lozinke i pokrenite

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Lozinka je ispravna";

I zašto vidimo našu poruku o ispravnoj lozinci? Vrlo je jednostavno... Funkcija preg_match(); zaustavlja provjeru pri prvom podudaranju. Odnosno, simbol "q" odgovara obrascu koji smo opisali, a sve ostalo više nije važno za funkciju. Što trebamo učiniti? Evo kako to popraviti:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Lozinka je ispravna";

Dodavanjem "^" na početku izraza i "$" na kraju, govorimo funkciji što uzorak treba odgovarati svi crta. Ako pokrenete ovaj kod, nećete vidjeti poruku jer se na kraju lozinke nalazi nedopušten znak - razmak

Sada promijenite metakarakter "+" u metakarakter "?". Što misliš da će se dogoditi? Ispravno, neće biti poruke o ispravnosti lozinke, jer lozinka sadrži više od jednog znaka. Nadam se da sam ispravno objasnio rad ova tri često korištena metakaraktera

Ponekad je "ne" bolje

Barem smo naučili provjeriti je li lozinka točna, i to je dobro! Ispričat ću vam još jedan način traženja nečega u nizu. Recimo da trebamo provjeriti nema li brojeva u nizu. Kako to učiniti? Evo retka:

(U nju sam posebno uveo ove simbole “-_+()” da život ne bi izgledao kao med...) Mogli bismo formulirati sljedeći izraz:

Ali morate priznati, ne znamo uvijek koji se znakovi koriste u retku, ali znamo sigurno da u njemu ne bi trebalo biti brojeva! Stoga bi bilo logičnije jednostavno napisati predložak koji bi preskakao retke u kojima Ne brojevima, a ne onima u kojima ima "O moj Bože, koliko nerazumljivih simbola!!!". Evo primjera ispravno sastavljenog izraza za takve probleme:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Bez brojeva!";

Kako smo to postigli? Upisali smo simbol Ali! kapa "^" ([^0-9]) postavljena na početku označava da će ih biti ne bi trebalo Nadam se da je ovo riješeno

Pa da završimo polako... Navest ću dva primjera s objašnjenjima, tijekom kojih ćemo naučiti kako spremiti rezultat pretraživanja u varijablu, te kako provjeriti točnost poštanske adrese

Vidio sam i spremio!

Moj blog

$a = " Moj blog";
preg_match("/ /", $a);

U našem regularnom izrazu opisali smo sve moguće znakove koji mogu biti uključeni u vezu. Također želim obratiti pozornost na znakove navodnika i “/” u našem izrazu. Ispred njih stoji obrnuta kosa crta, čemu to služi? Činjenica je da su "/" i navodnici sami po sebi posebni znakovi. A kako bi ih predložak mogao percipirati kao obične simbole, moramo ih ekranizirati. Escape se izvodi dodavanjem obrnute kose crte ispred posebnih znakova. Nadam se da je jasno

$a = " Moj blog";
preg_match("/ /", $a, $b);

Pa, sukladno tome, potrebno je dodati dodatni parametar u obliku varijable $b, u kojoj će se pohraniti pronađena veza. Također morate znati da se rezultat pretraživanja nalazi u nizu. Prema tome, varijabla $b je niz. Informacija koju tražimo nalazi se pod indeksom 1. To znači da je rezultat pretraživanja u varijabli $b. Prikažimo rezultat na ekranu:

$a = " Moj blog";
preg_match("/ /", $a, $b);
odjek $b;

Prava adresa je ključ uspjeha!

I za kraj odgovor na pitanje je li e-mail ispravan? Prvo morate saznati koji su znakovi dopušteni u adresama? Koliko ja znam, dozvoljeni znakovi uključuju:

  • Engleska slova, brojevi, “_”, “-” ummmm sve izgleda... Nastavit ćemo od ovoga.
  • Zatim imamo "@"
  • Poslije, engleska slova
  • Dalje, točka
  • I opet engleska slova...

Dakle, regularni izraz će biti sljedeći:

$a = " [e-mail zaštićen]";
if(preg_match("/^+@+.+$/", $a)) echo "e-mail adresa je točna!";
else echo "e-mail adresa NIJE ispravno napisana!";

Pa... Nadam se da vas takvi zapisi sada ne plaše i da ih sasvim možete razumjeti.

Na kraju, želim nešto reći. Članak se pokazao glomaznim, a ujedno je pokrivao samo dio mogućnosti. Ako čitate ovu rečenicu, onda ste je najvjerojatnije pročitali do kraja, na čemu vam veliko hvala

Što se tiče serije članaka o razvoju cms bloga, prvi dio serije Proglašavam zatvorenim! U bliskoj budućnosti počet ćemo implementirati administrativnu ploču, stoga nemojte "prebacivati" Ako imate bilo kakvih pitanja, rado ću odgovoriti. Svaka ti čast, to je sve od mene!

Pri radu s tekstovima u bilo kojem moderni jezik programiranja, programeri se stalno suočavaju sa zadatkom provjere usklađenosti unesenih podataka potreban predložak, traženje i zamjena testnih fragmenata i druge tipične operacije za obradu simboličkih informacija. Razvoj vlastitih verifikacijskih algoritama dovodi do gubitka vremena, nekompatibilnosti programskog koda i složenosti u njegovom razvoju i modernizaciji.

Brzi razvoj interneta i WEB razvojnih jezika zahtijevao je stvaranje univerzalnih i kompaktnih alata za obradu tekstualne informacije s minimalnom količinom koda potrebnom za to. Jezik PHP, popularan među početnicima i profesionalnim programerima, nije iznimka. Regularni izraz kao jezik tekstualnih predložaka omogućuje vam da pojednostavite zadatke obrade teksta i smanjite programski kod za desetke i stotine redaka. Bez njega se mnogi problemi ne mogu riješiti.

Regularni izrazi u PHP-u

Jezik PHP sadrži tri mehanizma za rad s regularnim izrazima - “ereg”, “mb_ereg” i “preg”. Najčešće je sučelje "preg", čije funkcije omogućuju pristup biblioteci regularnih izraza PCRE, izvorno razvijenoj za jezik Perl, koja je uključena u PHP. Preg funkcije traže zadani tekstualni niz za podudaranja prema određenom uzorku u jeziku regularnih izraza.

Osnove sintakse

Nemoguće je detaljno opisati cijelu sintaksu regularnih izraza u kratkom članku; za to postoji posebna literatura. Predstavljamo samo glavne elemente kako bismo pokazali široke mogućnosti programera i razumjeli primjere koda.

B je formalno definiran na vrlo složen način, pa pojednostavimo opis. Regularni izraz je tekstualni niz. Sastoji se od uzorka istaknutog graničnikom i modifikatorom koji pokazuje kako ga obraditi. Moguće uključivanje u predloške razne alternative i ponavljanja.

Na primjer, u izrazu /\d(3)-\d(2)-\d(2)/m separator će biti «/» , zatim dolazi uzorak i simbol "m" bit će modifikator.

Sva moć regularnih izraza kodirana je pomoću metaznakova. Glavni metakarakter jezika je obrnuta kosa crta - “\”. Obrće tip znaka koji ga slijedi (tj. regularni simbol pretvara u metakarakter i obrnuto). Još jedan važan metakarakter je kosa crta "|", koja specificira alternativne opcije predložak. Još primjera metakaraktera:

PHP, prilikom obrade regularnih izraza, tretira razmak kao poseban značajni znak, pa se izrazi ABCWHERE i ABCWHERE razlikuju.

Poduzorci

U PHP-u su uobičajeni poduzorci odvojeni zagradama i ponekad se nazivaju "podizrazi". Obavlja sljedeće funkcije:

    Isticanje alternativa. Na primjer, predložak vrućina (nešto|ptica|) odgovara riječima "vrućina", "žar ptica" I "pečenje". I bez zagrada bit će samo prazna linija, "perad" i "pečenje".

    "Uzbudljivi" poduzorak. To znači da ako se podniz podudara u uzorku, tada se sva podudaranja vraćaju kao rezultat. Radi jasnoće, dajmo primjer. Dat je sljedeći regularni izraz: pobjednik dobiva ((zlatni|pozlaćeni)(medalja|pehar)) - i redak za pronalaženje podudaranja: "pobjednik dobiva zlatnu medalju". Uz izvornu frazu, rezultat pretraživanja će vratiti: "Zlatna medalja", "medalja", "zlato".

Operatori ponavljanja (kvadrifikatori)

Pri pisanju regularnih izraza često je potrebno analizirati ponavljanja brojeva i simbola. To nije problem ako nema jako puno ponavljanja. Ali što učiniti kada ne znamo njihov točan broj? U tom slučaju morate koristiti posebne metaznakove.

Za opisivanje ponavljanja koriste se kvadrifikatori - metasimboli za određivanje količine. Postoje dvije vrste kvadrifikatora:

  • općenito, u zagradama;
  • skraćeno.

Opći kvantifikator navodi najmanji i najveći broj dopuštenih ponavljanja elementa, izražen kao dva broja u vitičastim zagradama, ovako: x(2,5). Ako je najveći broj ponavljanja nepoznat, drugi argument se izostavlja: x(2,).

Stenografski kvantifikatori predstavljaju simbole za najčešća ponavljanja kako bi se izbjegla nepotrebna sintaktička nered. Uobičajeno se koriste tri kratice:

1. * - nula ili više ponavljanja, što je ekvivalentno (0,).

2. + - jedno ili više ponavljanja, tj. ,).

3. ? - nula ili samo jedno ponavljanje - (0,1).

Primjeri regularnih izraza

Za one koji uče regularne izraze, primjeri su najbolji vodič. Predstavit ćemo nekoliko koji uz minimalan trud pokazuju svoje široke mogućnosti. svi programski kodovi potpuno kompatibilan sa PHP verzije 4.x i više. Za potpuno razumijevanje sintaksu i korištenje svih jezičnih značajki, preporučujemo knjigu J. Friedla “Regularni izrazi”, koja u potpunosti govori o sintaksi i sadrži primjere regularnih izraza ne samo u PHP-u, već i za Python jezici, Perl, MySQL, Java, Ruby i C#.

Provjera ispravnosti E-mail adrese

Zadatak. Postoji internetska stranica koja od posjetitelja traži e-mail adresu. Regularni izraz mora provjeriti je li primljena adresa ispravna prije slanja poruke. Provjera ne jamči da je navedeno poštanski sandučić zapravo postoji i prima pisma. Ali očito ga izbaciti krive adrese ona može.

Riješenje. Kao u bilo kojem programskom jeziku, regularni izrazi za provjeru adrese e-pošte mogu se implementirati u PHP različiti putevi, a primjeri u ovom članku nisu konačna i jedina opcija. Stoga ćemo za svaki slučaj dati popis zahtjeva koje je potrebno uzeti u obzir pri programiranju, a konkretna implementacija u potpunosti ovisi o programeru.

Dakle, izraz koji provjerava valjanost e-pošte mora provjeriti sljedeće uvjete:

  1. Dostupnost u izvorna linija simbol @ i bez razmaka.
  2. Dio adrese domene, iza kojeg slijedi simbol @, sadrži samo važeće znakove za nazive domena. Isto vrijedi i za korisničko ime.
  3. Kada provjeravate korisničko ime, morate tražiti posebne znakove kao što su apostrof ili Ovi znakovi su potencijalno opasni i mogu se koristiti u napadima kao što je SQL injection. Izbjegavajte takve adrese.
  4. Korisnička imena dopuštaju samo jednu točku, koja ne može biti prvi ili zadnji znak u retku.
  5. Naziv domene mora sadržavati najmanje dva, a ne više od šest znakova.

Primjer koji uzima sve u obzir navedeni uvjeti, može se vidjeti dalje na slici.

Provjera valjanosti URL-ova

Zadatak. Provjerite je li dati tekstualni niz važeći Još jednom, regularni izrazi za provjeru URL-a mogu se implementirati na razne načine.

Riješenje. Naša konačna verzija izgleda ovako:

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

Sada pogledajmo njegove komponente detaljnije pomoću slike.

Provjera brojeva kreditnih kartica

Zadatak. Potrebno je provjeriti ispravnost unesenog broja plastična kartica najčešći sustavi plaćanja. Opcija razmatrana samo za kartice

Riješenje. Prilikom izrade izraza morate uzeti u obzir moguću prisutnost razmaka u unesenom broju. Brojevi na kartici podijeljeni su u skupine radi lakšeg čitanja i diktiranja. Stoga je sasvim prirodno da osoba pokuša unijeti broj na ovaj način (tj. koristeći razmake).

Napiši univerzalni izraz koji uzima u obzir moguće praznine i crtice, teže je od jednostavnog odbacivanja svih znakova osim brojeva. Stoga se preporučuje korištenje metaznaka /D u izrazu, koji uklanja sve znakove osim brojeva.

Sada možete nastaviti izravno na provjeru broja. Sve tvrtke koje proizvode kreditne kartice, koristite jedinstveni format broja. Primjer koristi to, a klijent ne treba upisivati ​​naziv tvrtke - on se određuje brojem. Visa kartice uvijek počinju s 4 i imaju duljinu broja od 13 ili 16 znamenki. MasterCard počinje u rasponu 51-55 s duljinom broja 16. Kao rezultat, dobivamo sljedeći izraz:

Prije obrade vaše narudžbe, možete dodatna provjera zadnja znamenka broja, koja se izračunava pomoću Luhnovog algoritma.

Provjera telefonskih brojeva

Zadatak. Provjera ispravnosti unesenog broja telefona.

Riješenje. Broj znamenki u fiksnim i mobilnim telefonima telefonski brojevi značajno varira od zemlje do zemlje, tako da nije moguće univerzalno provjeriti je li telefonski broj ispravan korištenjem regularnih izraza. Ali međunarodni brojevi imaju strogi format i izvrsni su za provjeru prema predlošku. Štoviše, sve više nacionalni telefonski operateri pokušavajući se uklopiti jedinstveni standard. Struktura broja je sljedeća:

+CCC.NNNNNNNNNNxEEEE, Gdje:

C je šifra zemlje koja se sastoji od 1-3 znamenke.

N - broj do 14 znamenki.

E - izborni nastavak.

Plus je obavezan element, a znak x je prisutan samo kada je potrebno proširenje.

Kao rezultat toga, imamo sljedeći izraz:

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

Brojevi u rasponu

Zadatak. Morate odgovarati cijelom broju unutar određenog raspona. Osim toga, potrebno je da regularni izrazi odgovaraju samo brojevima iz raspona vrijednosti.

Riješenje. Evo nekoliko izraza za nekoliko najčešćih slučajeva:

Pronalaženje IP adrese

Zadatak. Morate utvrditi je li navedeni niz važeća IP adresa u IPv4 formatu u rasponu 000.000.000.000-255.255.255.255.

Riješenje. Kao i u svakom zadatku na PHP jezik, regularni izraz ima mnogo varijacija. Na primjer, ovo:

Online provjera izražavanja

Testiranje ispravnosti regularnih izraza može biti teško za nove programere zbog složenosti sintakse, koja se razlikuje od "običnih" programskih jezika. Da biste riješili ovaj problem, postoji mnogo online testera izraza koji olakšavaju provjeru ispravnosti stvorenog predloška na stvarnom tekstu. Programer unosi izraz i podatke koji se testiraju i odmah vidi rezultat obrade. Obično postoji i referentni dio u kojem su detaljno opisani regularni izrazi, primjeri i razlike u implementaciji za najčešće programske jezike.

Ali potpuno vjerovati rezultatima online usluga ne preporučuje se svim programerima koji koriste PHP. Regularni izraz, napisan i osobno testiran, poboljšava vašu vještinu i jamči odsutnost pogrešaka.

Najčešća upotreba regularnih izraza u Perlu je u operatorima pretraživanja i zamjene kao što je s//, m/, vezni operatori =~ ili != itd. U pravilu, svi ovi operateri imaju slične mogućnosti kao što su:

Obično su sve te opcije označene kao "/x". Mogu se čak koristiti unutar predložaka pomoću nove konstrukcije (?...)

Regularni izrazi ili obrasci isti su kao procedure regularnih izraza u Unixu. Izrazi i sintaksa posuđeni su iz slobodno distribuiranih V8 procedura Henryja Spencera, gdje su detaljno opisani.

Predlošci koriste sljedeće metaznakove (znakove koji označavaju grupe drugih znakova) koji se često nazivaju egrep standardom:

Metaznakovi imaju modifikatore (napisane nakon metakaraktera):

U svim drugim slučajevima vitičaste zagrade smatraju se običnim (pravilnim) znakovima. Stoga je "*" ekvivalent (0,) , "+" je (1,) i "?" - (0,1). n i m ne mogu biti veći od 65536.

Prema zadanim postavkama, metakarakteri su pohlepni. Podudaranje se propagira onoliko puta koliko je moguće, bez uzimanja u obzir učinka sljedećih metakaraktera. Ako im želite "smanjiti apetit", upotrijebite simbol "?". Ovo ne mijenja značenje metaznakova, samo smanjuje širenje. Tako:

Zamjenski znakovi rade na isti način kao dvostruki navodnici, tako da u njima možete koristiti znakove `\` (obrnute kose crte):

\t - znak kartice
\n - nova linija
\r - povrat kočije
\A - prijevod formata
\v - okomito tabeliranje
\a - poziv
\e - pobjeći
\033 - oktalni zapis simbola
\x1A - heksadecimalni
\c[ - kontrolni simbol
\l - mali sljedeći znak
\u - velika slova -//-
\L - svi likovi u mala slova prema \E
\U - u gornjem dijelu -//-
\E - limiter promjene registra
\Q - poništi akciju kao metakarakter

Osim toga, Perlu su dodani sljedeći metakarakteri:

Imajte na umu da je ovo sve "jedan" znak. Koristite modifikatore za označavanje slijeda. Tako:

Osim toga, postoje imaginarni metakarakteri. Označavanje nepostojećih simbola na mjestu promjene vrijednosti. kao što su:

Granica riječi (\b) je zamišljena točka između znakova \w i \W. Unutar klase znakova, "\b" predstavlja znak povratnice. Metakarakteri \A I \Z- slični su "^" i "$", ali ako početak retka "^" i kraj retka "$" djeluju za svaki red u nizu s više reda, tada \A I \Z označavaju početak i kraj cijelog višerednog niza.

Ako se unutar uzorka koristi grupiranje (zagrade), tada se broj podniza grupe označava kao "\cifra". Imajte na umu da slijedeći uzorak unutar izraza ili bloka, ove grupe su označene kao "$digit". Osim toga, postoje dodatne varijable:

Primjer:

$s = "Jedan 1 dva 2 i tri 3"; if ($s =~ /(\d+)\D+(\d+)/) ( print "$1\n"; # Rezultat "1" print "$2\n"; # "2" print "$+\n" ; # "2" print "$&\n"; # "1 two 2" print "$`\n"; # "One " print "$"\n"; # " and three 3" )

Perl verzija 5 sadrži dodatne konstrukcije predložaka:

Primjer:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Pronađite broj iza kojeg slijedi "-" ( print "$1\n"; # Rezultat "2") else ( print "search error\n" ;)

(?!uzorak) - “gledanje” unaprijed negacijom:

Primjer:

$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Pronađite znamenku iza koje ne slijedi "+" ( print "$1\n"; # Rezultat "2" ) else ( print "traži pogreška\n"; )

(?ismx) - “unutarnji” modifikatori. Pogodno je koristiti u predlošcima, gdje, na primjer, morate odrediti modifikator unutar predloška.

Pravila regularnog izraza. (regeks)

  1. Bilo koji znak predstavlja sam sebe osim ako nije metakarakter. Ako trebate poništiti učinak metaznaka, stavite "\" ispred njega.
  2. Niz znakova označava niz ovih znakova.
  3. Gomila mogući likovi(klasa) nalazi se u uglatim zagradama "", to znači da in ovo mjesto može biti jedan od znakova navedenih u zagradama. Ako je prvi znak u zagradama “^”, tada se nijedan od navedenih znakova ne može pojaviti na ovom mjestu u izrazu. Unutar klase možete koristiti simbol "-" za označavanje niza znakova. Na primjer, a-z je jedno od malih slova latinica, 0-9 - broj, itd.
  4. Forum PHP portala. S.U.

Regularni izrazi su posebni uzorci za traženje podnizova u tekstu. Uz njihovu pomoć u jednom retku možete riješiti sljedeće probleme: “provjeri sadrži li niz brojeve”, “pronađi sve email adrese", "zamijenite nekoliko uzastopnih upitnika jednim."

Počnimo s popularnom programerskom mudrošću:

Neki ljudi, kada se suoče s problemom, pomisle: "Da, ja sam pametan, riješit ću to koristeći regularne izraze." Sada imaju dva problema.

Primjeri šablona

Počnimo s parom jednostavni primjeri. Prvi izraz na slici ispod traži niz od 3 slova, gdje je prvo slovo "k", drugo je bilo koje rusko pismo a treći je "t" bez obzira na velika i mala slova (npr. "cat" ili "CAT" odgovara ovom obrascu). Drugi izraz traži vrijeme u tekstu u formatu 12:34.

Svaki izraz počinje znakom za razdvajanje. Kao njega se obično koristi simbol /, ali možete koristiti i druge simbole koji nemaju posebnu svrhu u regularnim izrazima, na primjer, ~, # ili @. Alternativni graničnici se koriste ako se znak / može pojaviti u izrazu. Onda on sam ode linijski uzorak, koje tražimo, nakon čega slijedi drugi graničnik i na kraju može biti jedno ili više slova zastavice. Oni pitaju dodatne opcije prilikom traženja teksta. Evo primjera zastava:

  • i - kaže da pretraživanje ne bi trebalo razlikovati velika i mala slova (prema zadanim postavkama osjetljivo na velika i mala slova)
  • u - kaže da izraz i tekst koji se pretražuju koriste utf-8 kodiranje, a ne samo slova. Bez nje traženje ruskih (i bilo kojih drugih nelatiničnih) znakova možda neće raditi ispravno, stoga biste je uvijek trebali postaviti.

Sam predložak sastoji se od običnih znakova i posebnih konstrukcija. Pa, na primjer, slovo "k" u regularnim izrazima znači samo sebe, ali simboli znače "bilo koji broj od 0 do 5 može biti na ovom mjestu." Ovdje puni popis posebni znakovi (u priručniku za PHP nazivaju se metaznakovi), a svi ostali znakovi u regularnom nizu su obični:

U nastavku ćemo analizirati značenje svakog od ovih znakova (i objasniti zašto je slovo "e" odvojeno u prvom izrazu), ali za sada pokušajmo primijeniti naše regularne izraze na tekst i vidjeti što će se dogoditi. Postoji u php posebna funkcija preg_match($regexp, $text, $match) , koji uzima regularni izraz, tekst i prazan niz kao ulaz. Provjerava sadrži li tekst podniz koji odgovara ovaj predložak i vraća 0 ako ne, ili 1 ako postoji. A u proslijeđenom nizu, prvo pronađeno podudaranje s pravilnim nizom smješta se u element s indeksom 0. Napišimo jednostavan program koji primjenjuje regularne izraze na različite nizove:

Nakon što pogledamo primjer, proučimo regularne izraze detaljnije.

Zagrade u regularnim izrazima

Ponovimo što znače različiti tipovi zagrade:

  • Vitičaste zagrade a(1,5) određuju broj ponavljanja prethodnog znaka - u ovom primjeru izraz traži 1 do 5 uzastopnih slova "a"
  • Uglate zagrade znače "bilo koji od ovih znakova", u ovom slučaju slova a, b, c, x, y, z ili broj od 0 do 5. Ostali posebni znakovi poput | ne rade unutar uglatih zagrada. ili * - označavaju pravilan znak. Ako u uglate zagrade na početku postoji simbol ^, zatim se značenje mijenja u suprotno: “bilo koji znak osim onih koji su navedeni” - na primjer [^a-c] znači “bilo koji znak osim a, b ili c”.
  • Okrugle zagrade grupni simboli i izrazi. Na primjer, u izrazu abc+, znak plus se odnosi samo na slovo c i ovaj izraz traži riječi kao što su abc, abcc, abccc. A ako stavite zagrade a(bc)+, tada se kvantifikator plus odnosi na niz bc i izraz traži riječi abc, abcbc, abcbcbc

Napomena: možete navesti raspon znakova u uglatim zagradama, ali zapamtite da je rusko slovo e odvojeno od abecede i da biste napisali "bilo koje rusko slovo" morate napisati [a-âe].

Bexslashes

Ako ste pogledali druge vodiče o regularnim izrazima, vjerojatno ste primijetili da se obrnuta kosa crta svugdje drugačije piše. Negdje pišu jednu obrnutu kosu crtu: \d , ali ovdje se u primjerima ponavlja 2 puta: \\d . Zašto?

Jezik regularnih izraza zahtijeva da jednom napišete obrnutu kosu crtu. Međutim, u redovima u jednostrukim i dvostruki navodnici U PHP-u kosa crta unazad ima i posebno značenje: priručnik o nizovima. Pa, na primjer, ako napišete $x = "\$"; onda će PHP ovo tretirati kao posebnu kombinaciju i umetnuti samo znak $ u niz (a mehanizam regularnih izraza neće znati za obrnutu kosu crtu prije njega). Da bismo umetnuli niz \$ u niz, moramo udvostručiti obrnutu kosu crtu i napisati kod kao $x = "\\$"; .

Iz tog razloga, u nekim slučajevima (gdje niz znakova ima posebno značenje u PHP-u) od nas se traži da udvostručimo obrnutu kosu crtu:

  • Za pisanje \$ u regularnom izrazu, pišemo "\\$" u kodu
  • Da bismo napisali \\ u regularnom izrazu, udvostručimo svaku obrnutu kosu crtu i napišemo "\\\\"
  • Da biste napisali obrnutu kosu crtu i broj (\1) u uobičajenom formatu, morate udvostručiti obrnutu kosu crtu: "\\1"

U drugim slučajevima, jedna ili dvije obrnute kose crte dat će isti rezultat: "\\d" i "\d" će umetnuti par znakova \d u red - u prvom slučaju, 2 obrnute kose crte su niz za umetanje obrnute kose crte , u drugom slučaju nema posebnog niza i znakovi će biti umetnuti kakvi jesu. Možete provjeriti koji će znakovi biti umetnuti u niz i što će mehanizam regularnih izraza vidjeti koristeći echo: echo "\$"; . Da, teško je, ali što možete učiniti?

Poseban dizajn u redovnoj sezoni

  • \d traži bilo koju jednu znamenku, \D - bilo koji znak osim znamenke
  • \w odgovara bilo kojem slovu (bilo koje abecede), broju ili podvlaci _. \W odgovara bilo kojem znaku osim slova, broja ili podvlake.

Također, postoji pogodan uvjet za označavanje granice riječi: \b . Ova konstrukcija znači da s jedne strane treba biti znak koji je slovo/broj/podvlaka (\w), a s druge strane treba biti znak koji to nije. Pa, na primjer, želimo pronaći riječ "mačka" u tekstu. Ako napišemo regularni izraz /cat/ui, on će pronaći niz ovih slova bilo gdje - na primjer, unutar riječi "stoka". Ovo očito nije ono što smo htjeli. Ako regularnom izrazu dodamo granični uvjet riječi: /\bcat\b/ui , sada će se pretraživati ​​samo samostalna riječ "cat".

Priručnik

  • Sintaksa regularnog izraza u PHP-u, detaljan opis

Najbolji članci na temu