Kako podesiti pametne telefone i računare. Informativni portal

Regularni izrazi php. Regularni izrazi

) Pokazao sam vam primjer korištenja regularnih izraza za pronalaženje određenih dijelova izvornog koda stranice. Sada ćemo naučiti kako ih sami napisati. Ova vještina će vam pomoći da pišete, očistite tekst od nepotrebnih fragmenata, tražite potrebne dijelove u velikim količinama teksta i tako dalje.

Ova tema je prilično teška, ali pokušaću da ukratko istaknem najvažnije tačke. Ne znam koliko to mogu, ali nadam se da će lekcija biti korisna.
Dakle, za početak postoji nekoliko funkcija za rad sa regularnim izrazima u PHP-u, ali se najčešće koriste tri:

  • preg_replace - pretraži i zamijeni tekst koji odgovara regularnom izrazu;
  • preg_match - samo redovna pretraga;
  • preg_split - pretraži i podijeli tekst.

Bar smo ih koristili u prethodnim lekcijama. Umjesto preg_match postojao je preg_match_all, ali ovo je u suštini ista stvar, samo što ovo drugo ne prekida pretragu nakon prvog pronalaska. Odnosno, ako koristimo preg_match, tada nećemo pronaći sve pojave, već samo prvu.

Izbor u kojoj situaciji koristiti koju funkciju je prilično jednostavan. Moramo zamijeniti - koristimo zamjenu, kao u slučaju kada smo trebali ukloniti nepotrebne dijelove koda stranice, sjećate se?

$ stranica = preg_replace ("/ ^] / i "," ", $ stranica); $ page = preg_replace (" / ^] / i "," ", $ stranica); $ page = str_replace (""," ", $ stranica);

Prvi parametar funkcije je regex, koji određuje ono što tražimo. Drugo je ono što zamjenjujemo. Treće - Gde tražimo. Stoga smo ovdje uzeli varijablu $ page i dodijelili joj rezultat funkcije preg_replace, gdje smo tražili sve polja za potvrdu tipa unosa =, kao i oznake za otvaranje i zatvaranje. Zamijenio ih sa ", odnosno jednostavno su obrisali. Nadam se da je ovde sve jasno. Na analizu samog izraza (prvi parametar funkcije) preći ćemo nešto kasnije.
Postojao je i primjer korištenja preg_match_all, koji je dobro došao za pronalaženje svih veza u ostatku teksta. Tada su nam bile potrebne veze jer su sadržavale ključne riječi koje smo analizirali. Evo šta se dogodilo:

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

Prvi parametar, opet, je regularan, za pronalaženje svih veza, koje su prirodno zatvorene u "a" tag (ako niste prijateljski s html markupom, onda ga pročitajte). Druga je varijabla koja sadrži tekst po kojem će se izvršiti pretraga. Treći parametar je varijabla u koju se stavlja rezultat - $ok. Nakon toga ostaje samo proći kroz sve potrebne $ok elemente kako bismo dobili ključeve koji su nam potrebni. Odvojeno, mora se reći da na izlazu dobijamo višedimenzionalni niz. Zato ga ispisujemo na tako komplikovan način: $ ok [$ j]. Da vidite strukturu niza, koristite funkciju ispod i sve ćete razumjeti.

Print_r ($ ok);

Evo, čini se, shvatili smo funkcije koje smo koristili za rad. Sada ostaje samo da naučite kako da napišete ove veoma regularne izraze, koji su prvi parametar svake od ovih metoda. Pređimo na ono najvažnije.

Kako pisati redovne

Prvo, pogledajmo osnovne konstrukcije. Izrazi imaju opcije. Navedeni su jednim slovom i napisani na kraju, ispred kojih je kosa crta.

Osim toga, podržani su sljedeći metaznakovi:

Metaznakovi, zauzvrat, mogu imati modifikatore:

E, sad možemo da pređemo na analizu naših redovnika sa prošle lekcije. Na osnovu gornjih tableta, hajde da pokušamo da shvatimo šta imamo. Evo izraza:

/^] / i

Prva i zadnja kosa crta "/" označavaju da se unutar njih nalazi regularni izraz. Istovremeno, nakon zadnjeg, stavljamo "i", ovo je opcija, kao u prvoj tabeli - ne razlikuje velika i mala slova. Unutar kosih crta, sama redovna linija. Počinje znakom manje od i oznakom za unos, i svime što slijedi do znaka tačke, što je jednostavan tekst za traženje. Ali sama tačka i simboli nakon nje - ovo je već zanimljivije. U ovom slučaju, konstrukcija ". *?" označava bilo koji niz znakova. Odnosno, ako kombinujete samo tekst i datu konstrukciju, onda ćemo selektovati sav tekst nakon prvog pojavljivanja do kraja. Da biste zaustavili, morate ispuniti ili završnu html oznaku "veće od", ili znak novog reda. Ovaj dizajn nam samo daje ovu priliku:

Simboli u uglastim zagradama su, takoreći, povezani logičkim ILI. Kraj je znak veće od ILI početak reda.
To je cijeli izraz, u njemu postavljamo početni uslov, srednji i krajnji uslov. Nije teško, zar ne? Evo ilustracije radi jasnoće:

Hajde da razbijemo još jednu da sve učvrstimo. Tražili smo ih za linkove:

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

Čitamo izraz. Opet, prvo odbacite kose crte i opcije. Oznake "uis" su razumljive, osim "u" koje nisam opisao - to ukazuje da koristimo Unicode kodiranje. Ne ostaje mnogo. Početak je oznaka "a", koja se otvara, zatim dolazi klasa

što znači NE više ili manje (otvaranje i zatvaranje html tagova), odnosno bilo koji karakter u ovom slučaju. Klasi se dodaje "+?", što znači da će ova klasa biti prisutna 1 ili više puta (ali barem 1 put sigurno). A onda dolazi završna html oznaka za "a" oznaku. Unutar linka se nalazi tekst koji postavlja grupa

Uostalom, ne znamo kakav će tekst biti tamo, pa definišemo takvu grupu. I na kraju, završni tag "a":

Imajte na umu da kosu crtu izbjegavamo obrnutom kosom crtom tako da se ona percipira kao običan tekst.

Fuh. Tema je zaista kompleksna, potrebna je praksa. Možda ne radim nešto sasvim optimalno i možete kreirati druge, ispravnije regularne izraze, ali ja sam ista samouka osoba kao i vi, tako da ne sudite striktno, već podijelite svoje opcije u komentarima. Također, ako nešto nije jasno - komentari i stranica za kontakt su Vam na usluzi.

Počnimo od toga šta je regex. Evo odgovora na moje pitanje, postoji li slovo "e" u riječi "test"? "Tu je!" ti kažeš. Onda vam postavljam drugo pitanje, kako ste našli slovo "e" u reči "test"? Odgovor je očigledan, uzimamo prvi znak, odnosno "t" i uporedimo ga sa onim što tražimo, odnosno sa "e". Ako nisu jednaki, onda uzimamo drugi znak, odnosno "e", uporedimo ga sa onim što tražimo, odnosno "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 regularni izraz ono što tražimo u riječi "test". To jest, slovo "e" u ovom primjeru je regularni izraz.

Za šta se koriste regularni izrazi u php-u? U mojoj praksi, regularni izrazi su korišteni, na primjer, da se utvrdi da li je adresa e-pošte dobro oblikovana. Takvi izrazi se također koriste za utvrđivanje ispravnosti korisničkog imena i lozinke. Koristeći regularne izraze, možete pronaći adresu na linku i sačuvati je. Mnogo 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 su spremanje pronađenih podudaranja i njihova zamjena.

Prvi regularni izraz

U teoriji, razumijemo kako pronaći simbol "e" u riječi "test", kako se to implementira 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 pohranjuje rezultat pretraživanja (opcijski parametar)"); - Funkcija podudaranja
preg_replace ("regularni izraz (uzorak)", "Čime zamijeniti pronađeno podudaranje", "varijabla u koju zamijeniti"); - Funkcija zamjene

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

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

Kôd opisuje stanje, ako se nešto nađe u varijabli $ a pomoću uzorka, onda se prikaže poruka "pronađeno !!" Kao što vidite, naš obrazac je između dva "/". U ovom slučaju, "/" simbolizira početak i kraj našeg šablona... Nadam se da je ovo jasno.

Sve ovo je naravno zanimljivo... ali to je samo naš šablon, koji je vrlo jednostavan, zar ne? Na kraju krajeva, rijetko moramo pronaći neki simbol u varijabli. U većini slučajeva moramo pronaći mnogo simbola, štaviše, nepoznatih. Kako biti? Postavimo sebi problem i pokušajmo ga riješiti. Pretpostavimo da imamo niz koji se sastoji od brojeva i jednog nepoznatog engleskog slova

Kako pronalazite ovo pismo? Može postojati bilo koje slovo engleskog alfabeta, kako ga možete definirati? Sami ste odgovorili na svoje pitanje, postoji bilo koje slovo, odnosno ono je u rasponu od a do z. Opsezi se mogu koristiti u regularnim izrazima. Ako ne znamo koji znak tražimo, ali sigurno znamo da je ovaj znak slovo engleske abecede, tada će zapis biti sljedeći:

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

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

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

Takođe želim da napomenem da su regularni izrazi osjetljivi na velika i mala slova, pa su znakovi "A" i "a" potpuno različiti, za traženje tih i tih znakova pišu ovako:

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

Postoji i pretraga ruskih slova, vrši se na isti način kao i kod engleskog:

$ a = "123y321";
if (preg_match ("/ [a-za-z] /", $ a)) echo "pronađeno !!";

Metakarakteri

Naučili smo kako tražiti nepoznati karakter u nizu. Šta ako trebamo pronaći nekoliko simbola? Takozvani metaznakovi dolaze u pomoć... Pretpostavimo da imamo niz sa brojevima, slovima, kako to opisati u šablonu? Ti to možeš:

niz - 123a321
uzorak -

Hmm... predložak zaista odgovara našem nizu, a kada se provjeri usklađenost, dat će dugo očekivanu istinitost! Ali neka vrsta glomaznog snimanja, zar ne?

Evo kako ga možete skratiti:

niz - 123a321
uzorak - *

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

Koji drugi metaznakovi postoje?

Na primjer, metaznak "+" Skoro je sličan metaznaku "*" sa jednim malim izuzetkom. "*" će vratiti true čak i ako nema znaka, a "+" će provjeriti prisustvo barem jednog znaka. Odnosno, ako niz zahtijeva prisustvo minimum jedan znak, a zatim koristite "+" umjesto "*"

Metaznak "?" To znači da niz ne smije sadržavati više od jednog potrebnog znaka. Dozvolite mi da vam dam nekoliko primjera za posljednja dva metaznaka koja sam opisao.

Pretpostavimo da trebamo provjeriti je li korisnička lozinka tačna. Razmislimo o tome šta bi korisnička lozinka trebala sadržavati? Pa, prvo, mora biti barem jedan znak. Drugo, trebalo bi da sadrži samo brojeve i slova engleske abecede, pa će regularni izraz izgledati ovako:

$ a = "qwerty12345";

Koje znakove smo dozvolili? Engleska slova bilo kojeg registra i brojeva. Sada pokušajte ostaviti prazan red umjesto lozinke.

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

Nećete vidjeti poruku "Lozinka je ispravna". Zašto? Zato što je metaznak "+" provjeravao da string sadrži najmanje jedan znak.

A sad mali trik, da pogledamo naš izraz lica, nismo dozvolili, recimo, prostora u njemu, zar ne? stavite razmak na kraj lozinke i pokrenite

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

I zašto vidimo našu poruku o ispravnoj lozinki? Prilično jednostavno ... funkcija preg_match (); zaustavlja svoju provjeru pri prvom meču. Odnosno, znak "q" odgovara uzorku koji smo mi opisali, a sve ostalo više nije važno za funkciju. Pa šta da radimo? Evo kako to popraviti:

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

Dodavanjem "^" na početak izraza i "$" na kraju, kažemo funkciji da odgovara uzorku. sve linija. Ako pokrenete ovaj kod, nećete vidjeti poruku, jer kraj lozinke sadrži nevažeći znak - razmak

Sada promijenite metaznak "+" u "?" Šta mislite da će se dogoditi? Ispravna poruka o ispravnosti lozinke će izostati, jer lozinka sadrži više od jednog karaktera. Nadam se da sam pravilno objasnio kako ova tri najčešće korišćena metaznaka funkcionišu.

Ponekad je bolje "ne".

U najmanju ruku, naučili smo kako provjeriti ispravnost lozinke, i to je dobro! Dozvolite mi da vam ispričam još jedan način da pronađete nešto u nizu. Recimo da trebamo provjeriti da nema brojeva u nizu. Kako uraditi? Evo linije:

(Namjerno sam u njega uveo ove simbole "-_ + ()" kako život ne bi izgledao kao med...) Mogli bismo sastaviti sljedeći izraz:

Ali morate se složiti, jer ne znamo uvijek koji se znakovi koriste u nizu, ali sigurno znamo da u njemu ne bi trebalo biti brojeva! Stoga bi bilo logičnije jednostavno napisati šablon koji bi preskakao redove u kojima br cifre, a ne one u kojima postoji "O moj Bože, koliko neshvatljivih simbola !!!"... Evo primjera dobro oblikovanog izraza za takve zadatke:

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

Kako smo to postigli? Uveli smo simbol ali! kapa "^" ([^ 0-9]) postavljena na početku znači da linija ovog znaka sadrži ne bi trebalo Nadam se da smo to shvatili

Pa, da završimo malo... Navest ću dva primjera sa objašnjenjima, tokom kojih ćemo naučiti kako sačuvati rezultat pretrage u varijablu, te naučiti kako provjeriti ispravnost poštanske adrese

Video sam, sačuvao sam!

Moj blog

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

U našem regularnom izrazu opisali smo sve moguće znakove koji se mogu uključiti u vezu. Takođe želim da skrenem pažnju na navodnike i znakove "/" u našem izrazu.. Prethodi im obrnuta kosa crta, čemu služi? Poenta je da su "/" i navodnik sami po sebi posebni znakovi. A da bi ih predložak percipirao kao obične simbole, moramo ih ekranizirati. Provjera se vrši dodavanjem obrnute kose crte ispred posebnih znakova. Nadam se da je jasno

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

Pa, u skladu s tim, trebate dodati dodatni parametar u obliku varijable $ b, u koji će se pohraniti pronađena veza. Također morate znati da je rezultat pretraživanja smješten u niz. Dakle, varijabla $ b je niz. Informacije koje tražimo nalaze se pod indeksom 1. To znači da je rezultat pretrage u varijabli $ b. prikazaćemo rezultat na ekranu:

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

Tačna adresa je ključ uspjeha!

Pa, na sljedeći korak, odgovor na pitanje, da li je e-mail tačan? Prvo, morate znati koji su znakovi dozvoljeni u adresama? Koliko ja znam, dozvoljeni znakovi uključuju:

  • Engleska slova, brojevi, "_", "-" emmmm kao i sve... Krenimo od ovoga.
  • Zatim imamo "@"
  • Poslije engleska slova
  • Dalje, poenta
  • I opet engleska slova...

Dakle, regularni izraz će biti sljedeći:

$ a = " [email protected]";
if (preg_match ("/ ^ [email protected]+. + $ / ", $ a)) echo" Adresa e-pošte je tačna! ";
else echo "Adresa e-pošte NIJE tačna!";

Pa... nadam se da vas ovakvi zapisi sada ne plaše i da ih sasvim razumete.

U nastavku, želim nešto reći. Članak se pokazao glomaznim, a istovremeno je pokrivao samo dio mogućnosti. Ako čitate ovu rečenicu, onda ste je najvjerovatnije pročitali do kraja, na čemu vam puno hvala

Što se tiče ciklusa članaka o razvoju cms bloga, prvi dio ciklusa Objavljujem da je zatvoreno! U bliskoj budućnosti ćemo početi sa implementacijom admin panela, tako da nemojte "prebacivati" Ako imate pitanja, rado ću odgovoriti. Svaka cast, imam sve!

Regularni izrazi su posebni obrasci za pronalaženje podniza u tekstu. Uz njihovu pomoć možete riješiti sljedeće zadatke u jednom redu: “provjeriti da li niz sadrži brojeve”, “pronađi sve adrese e-pošte u tekstu”, “zamijeni nekoliko uzastopnih upitnika jednim”.

Počnimo s jednom popularnom programskom mudrošću:

Neki ljudi, kada se suoče sa problemom, pomisle: "Da, ja sam pametan, rešiću to regularnim izrazima." Sada imaju dva problema.

Uzorci šablona

Počnimo s nekoliko jednostavnih primjera. Prvi izraz na slici ispod traži niz od 3 slova, pri čemu je prvo slovo "k", drugo je bilo koje rusko slovo, a treće "t" ne razlikuje velika i mala slova (na primjer, "mačka" ili "CAT" odgovara ovom obrascu). Drugi izraz traži vrijeme u tekstu u formatu 12:34.

Svaki izraz počinje znakom za razdvajanje. Simbol / se obično koristi kao on, ali možete koristiti i druge simbole koji nemaju posebnu svrhu u regularnim obrascima, na primjer, ~, # ili @. Alternativni graničnici se koriste ako se / može pojaviti u izrazu. Zatim dolazi uzorak niza koji tražimo, nakon čega slijedi drugi graničnik, a na kraju može biti jedno ili više slova zastavice. Oni pružaju dodatne opcije prilikom traženja teksta. Evo nekoliko primjera zastava:

  • i - kaže da pretraga treba da bude neosjetljiva na velika i mala slova (podrazumevano osjetljiva na velika i mala slova)
  • u - kaže da izraz i tekst koji se traže koriste utf-8 kodiranje, a ne samo latinična slova. Bez toga, pretraga za ruskim (i bilo kojim drugim nelatinskim) znakovima možda neće raditi ispravno, tako da biste ga uvijek trebali koristiti.

Sam šablon se sastoji od regularnih simbola i posebnih konstrukcija. Pa, na primjer, slovo "k" u redovnim redovima znači samo sebe, ali simboli znače "na ovom mjestu može biti bilo koji broj od 0 do 5". Evo kompletne liste specijalnih znakova (oni se u php priručniku zovu metaznakovi), a svi ostali znakovi u redovnom izrazu su normalni:

U nastavku ćemo analizirati značenje svakog od ovih simbola (i takođe objasniti zašto se slovo "ë" prikazuje zasebno u prvom izrazu), ali za sada pokušajmo da primijenimo naše regularne izraze na tekst i vidimo šta se dešava. Php ima posebnu funkciju preg_match ($ regexp, $ text, $ match) koja uzima regularni uzorak, tekst i prazan niz kao ulaz. Provjerava da li tekst sadrži podniz koji odgovara datom uzorku i vraća 0 ako ne, ili 1 ako postoji. A u proslijeđenom nizu u elementu s indeksom 0, stavlja se prvo pronađeno podudaranje s regexom. Napišimo jednostavan program koji primjenjuje regularne izraze na različite nizove:

Nakon što se upoznamo s primjerom, detaljnije ćemo proučiti regularne izraze.

Zagrade u regularnim izrazima

Ponovimo šta znače različite vrste zagrada:

  • Vitičaste zagrade a (1,5) određuju broj ponavljanja prethodnog znaka - u ovom primjeru izraz traži 1 do 5 uzastopnih slova "a"
  • Uglaste 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 specijalni znakovi kao što su | ili * - predstavljaju običan znak. Ako je simbol ^ na početku uglastih zagrada, značenje je obrnuto: "bilo koji znak osim navedenih" - na primjer [^ a-c] znači "bilo koji znak osim a, b ili c".
  • Zagrade grupišu znakove i izraze. Na primjer, u izrazu abc + znak plus se odnosi samo na slovo c i ovaj izraz traži riječi poput abc, abcc, abccc. A ako stavite zagrade a (bc) + onda se kvantifikator plus odnosi na niz bc i izraz traži riječi abc, abcbc, abcbcbc

Napomena: u uglastim zagradama možete navesti opsege znakova, ali zapamtite da rusko slovo ë ide odvojeno od abecede i da biste napisali "bilo koje rusko slovo", morate napisati [a-yayo].

Bexsles

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

Jezik regularnog izraza zahtijeva da jednom napišete obrnutu kosu crtu. Međutim, u stringovima sa jednim i dvostrukim navodnicima u PHP-u, obrnuta kosa crta takođe ima posebno značenje: uputstvo za stringove. Pa, na primjer, ako napišete $ x = "\ $"; onda će PHP ovo protumačiti kao posebnu kombinaciju i samo umetnuti znak $ u string (a mehanizam za regex neće znati za obrnutu kosu crtu ispred njega). Da bismo umetnuli niz \ $ u string, moramo udvostručiti obrnutu kosu crtu i napisati kod kao $ x = "\\ $"; ...

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

  • Da upišemo \ $ u regularni izraz, upisujemo kod "\\ $"
  • Da bismo napisali \\ u regularnom izrazu, udvostručimo svaku obrnutu kosu crtu i pišemo "\\\\"
  • Da biste napisali obrnutu kosu crtu i broj (\ 1) u regularnu mrežu, obrnutu kosu crtu morate udvostručiti: "\\ 1"

U drugim slučajevima, jedna ili dvije obrnute kose crte će dati isti rezultat: "\\ d" i "\ d" će umetnuti par \d karaktera u niz - 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 takvi kakvi jesu. Možete provjeriti koji su znakovi umetnuti u string i šta regex engine vidi pomoću echo: echo "\ $"; ... Da, teško je, ali šta možete učiniti?

Specijalne konstrukcije u regularima

  • \ d traži bilo koju cifru, \ D - bilo koji znak osim cifre
  • \ w odgovara bilo kojem pojedinačnom slovu (bilo kojoj abecedi), cifri ili donjoj crti _. \ W odgovara bilo kojem znaku osim slova, broja, donje crte.

Takođe, postoji pogodan uslov za označavanje granice reči: \ b. Ova konstrukcija znači da na jednoj strani mora biti znak koji je slovo / broj / donja crta (\ w), a na drugoj ne. Pa, na primjer, želimo da pronađemo riječ "mačka" u tekstu. Ako napišemo regex / cat / ui, onda će pronaći niz ovih slova bilo gdje - na primjer, unutar riječi "stoka". Ovo očigledno nije ono što smo želeli. Ako dodamo granični uslov riječi u regex: / \ bcat \ b / ui, tada će se tražiti samo posebna riječ "mačka".

Manual

  • PHP sintaksa regularnog izraza, detaljan opis

Kada rade s tekstovima na bilo kojem modernom programskom jeziku, programeri se stalno suočavaju sa zadacima provjere unesenih podataka da li su u skladu sa željenim uzorkom, pronalaženja i zamjene fragmenata testa i drugih tipičnih operacija za obradu simboličkih informacija. Razvoj vlastitih algoritama za verifikaciju dovodi do gubitka vremena, nekompatibilnosti programskog koda i složenosti u njegovom razvoju i modernizaciji.

Brzi razvoj Interneta i jezika za razvoj WEB-a zahtijevao je stvaranje univerzalnih i kompaktnih sredstava za obradu tekstualnih informacija s minimalnom količinom koda potrebnog za to. PHP jezik, koji je popularan među početnicima i profesionalnim programerima, nije izuzetak. Regularni izraz kao jezik šablona teksta omogućava pojednostavljenje zadataka obrade teksta i smanjenje programskog koda za desetine ili stotine redova. Bez toga se mnogi zadaci uopće ne mogu riješiti.

Regularni izrazi u PHP-u

PHP jezik sadrži tri mehanizma za rad sa regularnim izrazima - "ereg", "mb_ereg" i "preg". Najčešći je "preg" interfejs, čije funkcije obezbeđuju pristup PCRE biblioteci regularnih izraza, prvobitno razvijenoj za jezik Perl, koji je uključen u PHP. Preg funkcije traže podudaranja u datom tekstualnom nizu prema određenom obrascu u jeziku regularnog izraza.

Osnove sintakse

U okviru kratkog članka nemoguće je detaljno opisati cjelokupnu sintaksu regularnih izraza, za to postoji posebna literatura. Evo samo glavnih elemenata koji pokazuju široke mogućnosti programera i razumiju primjere koda.

Formalno je to vrlo teško definisati, pa ćemo zato pojednostaviti opis. Regularni izraz je tekstualni niz. Sastoji se od razgraničenog predloška i modifikatora koji specificira kako se njime rukuje. U šablone je moguće uključiti različite alternative i ponavljanja.

Na primjer, u izrazu / \ d (3) - \ d (2) - \ d (2) / m separator će biti «/» , nakon čega slijedi uzorak i simbol "M"će biti modifikator.

Sva moć regularnih izraza je kodirana pomoću metakaraktera. Glavni metaznak jezika je obrnuta kosa crta - "\". On mijenja tip sljedećeg znaka u suprotan (to jest, običan znak postaje metaznak i obrnuto). Drugi važan metaznak je kosa crta "|", koja specificira alternative uzorku. Još primjera metakaraktera:

PHP tretira prostor kao poseban značajni karakter prilikom obrade regularnih izraza, tako da su izrazi ABCGDE i ABC WHERE različiti.

Podobrasci

U PHP-u, regularni podobrasci su zatvoreni u zagradama i ponekad se nazivaju "podizrazima". Oni obavljaju sljedeće funkcije:

    Isticanje alternativa... Na primjer, šablon vrućina (neke | ptica |) odgovara riječima "vrućina", "žarena ptica" i "pečenje"... A bez zagrada, to će biti samo prazan niz, "ptica" i "pečenka".

    "uzbudljiv" poduzorak. To znači da ako se podniz podudara u obrascu, onda se sva podudaranja vraćaju kao rezultat. Radi jasnoće, dajmo primjer. S obzirom na sljedeći regularni izraz: pobjednik prima ((zlato | pozlaćeno) (medalja | pehar)) - i niz za pronalaženje podudaranja: "Pobjednik dobija zlatnu medalju"... Pored originalne fraze, pretraga će vratiti: "Zlatna medalja", "medalja", "zlato".

Operatori ponavljanja (kvadrifikatori)

Prilikom pisanja regularnih izraza vrlo je često potrebno analizirati ponavljanje brojeva i simbola. Ovo nije problem ako nema mnogo ponavljanja. Ali šta ako ne znamo njihov tačan broj? U ovom slučaju morate koristiti posebne metakaraktere.

Za opisivanje ponavljanja koriste se kvadrifikatori - metaznakovi za određivanje broja. Kvadrifikatori su dva tipa:

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

Uobičajeni kvantifikator specificira minimalni i maksimalni broj dozvoljenih ponavljanja elementa u obliku dva broja u vitičastim zagradama, na primjer: x (2.5). Ako je maksimalni broj ponavljanja nepoznat, drugi argument se izostavlja: x (2,).

Skraćeni kvantifikatori su znakovi za najčešća ponavljanja kako bi se izbjeglo nepotrebno preopterećenje sintakse. Obično se koriste tri skraćenice:

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 regularnog izraza

Za svakoga ko uči regularne izraze, primjeri su najbolji vodič. Navest ćemo nekoliko koji pokazuju svoje široke mogućnosti uz minimum truda. Svi programski kodovi su u potpunosti kompatibilni sa PHP 4.x i novijim verzijama. Za potpuno razumijevanje sintakse i korištenje svih karakteristika jezika, preporučujemo knjigu J. Friedla "Regular Expressions", koja u potpunosti ispituje sintaksu i daje primjere regularnih izraza ne samo u PHP-u, već i za jezici Python, Perl, MySQL, Java, Ruby i C#.

Provjera ispravnosti E-mail adrese

Zadatak. Postoji web stranica koja od posjetitelja traži email adresu. Regularni izraz mora provjeriti valjanost primljene adrese prije slanja poruke. Verifikacija ne garantuje da navedeno poštansko sanduče zaista postoji i da prihvata pisma. Ali može ukloniti namjerno netačne adrese.

Rješenje. Kao i sa svakim programskim jezikom, u PHP-u se regularni izrazi za validaciju adrese e-pošte mogu implementirati na mnogo različitih načina, a primjeri u ovom članku nisu konačna i jedina opcija. Stoga ćemo u svakom slučaju dati listu zahtjeva koje je potrebno uzeti u obzir prilikom programiranja, a konkretna implementacija je u potpunosti na programeru.

Dakle, izraz za provjeru valjanosti e-pošte treba provjeriti sljedeće uslove:

  1. Prisustvo simbola @ u originalnom nizu i odsustvo razmaka.
  2. Domenski dio adrese, iza kojeg slijedi simbol @, sadrži samo važeće znakove za imena domena. Isto vrijedi i za korisničko ime.
  3. Prilikom provjere korisničkog imena potrebno je utvrditi prisutnost posebnih znakova kao što je apostrof ili. Takvi znakovi su potencijalno opasni i mogu biti sadržani u napadima kao što je SQL injekcija. Izbjegavajte takve adrese.
  4. Korisnička imena prihvataju samo jednu tačku, koja ne može biti prvi ili poslednji znak u redu.
  5. Ime domene mora sadržavati najmanje dva i ne više od šest znakova.

Primjer koji uzima u obzir sve ove uvjete može se vidjeti na donjoj slici.

Validacija URL-ova

Zadatak. Provjerite da li je dati tekstualni niz valjan. Imajte na umu da regularni izrazi za validaciju URL-a mogu biti implementirani na različite načine.

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

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

Sada analizirajmo njegove komponente detaljnije koristeći sliku.

Provjera brojeva kreditnih kartica

Zadatak. Potrebno je provjeriti ispravnost unesenog broja plastične kartice najčešćih platnih sistema. Razmatrana opcija samo za kartice

Rješenje. Prilikom kreiranja izraza morate uzeti u obzir moguće prisustvo razmaka u unesenom broju. Brojevi na kartici su podijeljeni u grupe radi lakšeg čitanja i diktata. Stoga je sasvim prirodno da osoba pokuša da unese broj na ovaj način (tj. koristeći razmake).

Pisanje generičkog izraza koji uzima u obzir moguće razmake i crtice je teže nego jednostavno odbaciti sve znakove osim brojeva. Stoga se preporučuje korištenje metaznaka / D u izrazu, koji uklanja sve znakove osim brojeva.

Sada možete ići direktno na provjeru broja. Sve kompanije za izdavanje kreditnih kartica koriste jedinstveni format broja. U primjeru se to koristi i kupac ne mora upisivati ​​naziv kompanije - on se identificira brojem. Visa kartice uvijek počinju sa 4 i imaju 13 ili 16 cifara. MasterCard počinje u rasponu 51-55 sa dužinom broja 16. Kao rezultat, dobijamo sljedeći izraz:

Prije obrade narudžbe možete dodatno provjeriti posljednju cifru broja koja se izračunava Luna algoritmom.

Provjeravanje brojeva telefona

Zadatak. Provjera ispravnosti unesenog broja telefona.

Rješenje. Broj cifara u brojevima fiksnih i mobilnih telefona značajno varira od zemlje do zemlje, tako da je nemoguće univerzalno provjeriti ispravnost telefonskog broja koristeći regularne izraze. Ali međunarodni brojevi imaju strogi format i odlični su za provjeru uzoraka. Štaviše, sve više nacionalnih telefonskih operatera pokušava da se pridržava jedinstvenog standarda. Struktura izdanja je sljedeća:

+ CCC.NNNNNNNNNNxEEEE, gdje:

C je 1-3 cifren kod zemlje.

N - broj do 14 cifara.

E je opciona ekstenzija.

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

Kao rezultat, imamo sljedeći izraz:

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

Brojevi u rasponu

Zadatak. Morate osigurati da se cijeli broj iz specificiranog raspona podudara. Dodatno, potrebno je da regularni izrazi pronađu samo brojeve iz raspona vrijednosti.

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

Pronalaženje IP adrese

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

Rješenje. Kao i svaki zadatak u PHP-u, regularni izraz ima mnogo varijacija. Na primjer, nešto ovako:

Online provjera izraza

Provjera ispravnosti regularnih izraza može biti teška za programere početnike zbog složenosti sintakse, koja se razlikuje od "normalnih" programskih jezika. Da biste riješili ovaj problem, postoji mnogo online testera izraza koji vam omogućavaju da lako provjerite ispravnost kreiranog predloška na stvarnom tekstu. Programer unosi izraz i podatke za verifikaciju i trenutno vidi rezultat obrade. Obično postoji i referentni odjeljak, koji detaljno opisuje regularne izraze, primjere i razlike u implementaciji za najčešće programske jezike.

Ali potpuno povjerenje u rezultate online usluga ne preporučuje se svim programerima koji koriste PHP. Redovni izraz, napisan i testiran lično, je ažuran i zagarantovan je bez grešaka.

Regularni izrazi su vrlo moćan, ali u isto vrijeme teško razumljiv alat za obradu stringova. Opisaću glavne tačke. Regularni izraz je uzorak niza. Koristeći ovaj obrazac, možete tražiti pojavljivanja, vršiti zamjene, provjeriti podudaranje uzorka.

Pravila sastavljanja uzoraka

Granice šablona treba da budu označene određenim simbolima, često koristite " / "ali ja radije koristim" # "jer obilje kosih crta naprijed/nazad može učiniti da vaše oči izgledaju grozno, a "rešetke" se obično ne koriste nigdje drugdje. Dakle:" #RegularExpressionBody #"

Unutar regularnog izraza koriste se zagrade - to su podizrazi kojima se može manipulirati, na primjer:

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

Ovaj izraz služi za dobivanje parametara u nizu Url... Na početku reda nalazi se poseban znak " ^ "- ovo znači početak reda. Sljedeće dolazi" / katalog /"- nema posebnih znakova, ovo je samo tekst koji bi trebao biti sadržan u nizu. Tada su se susreli sa zagradama, odnosno stigli su do prvog podizraza. Uglaste zagrade označavaju skup karaktera koji se može nalaziti u nizu na ovom mjestu . Potpiši" - "znači nabrajanje. Znak" \ "izbjegava specijalne znakove. Dakle, u prvom podizrazu možemo imati VELIKA i mala slova latinice, brojeve od 0 do 9, donju crtu, crticu i tačku. Crtica i tačka su specijalni znakovi, ali ovdje se izbjegavaju, pa ovdje su to samo simboli. Nakon uglastih zagrada nalazi se " + "- to znači da prethodni znak (a mi imamo ovaj skup znakova u uglastim zagradama) može ići 1 ili više puta. Zatim dolazi" / "je samo lik, i sličan drugi podizraz. Onda dolazi" \ .html"što znači tekst" .html". A onda specijalni znakovi" .* "tačka znači bilo koji znak, a zvjezdica znači bilo koju količinu prethodnog znaka. To jest, poslije" .html„sve može proći.

Indikacija količine, kvantifikatori

Iznad smo već razmatrali takve znakove koji označavaju broj prethodnih znakova, kao npr + i * ... Evo svih mogućnosti za određivanje količine:

Posebni znakovi

Postoje posebne skraćenice za neke grupe znakova:

"pohlepa"

Hajde da pogledamo pojam pohlepe za regex. Na primjer, postoji linija:

#()#

Čitamo: podizraz:

Ako je sve ispravno, podizraz se podudara:

Ali takođe odgovara:

Dobićemo to, jer regularni izrazi su po defaultu pohlepni. Možete ukloniti pohlepu pomoću modifikatora " U", Volim ovo:

#() #U

Modifikatori

Regularni izraz može biti praćen modifikatorima: " #ThereRegularExpressionBody #ThatModifiers"Vrste modifikatora:

i Uključuje način rada bez obzira na velika i mala slova, tj. velika i mala slova se ne razlikuju u izrazu.
m Označava da se tekst koji se traži treba tretirati kao više redova. Po zadanim postavkama, mehanizam regularnih izraza tretira tekst kao jedan niz, bez obzira na to kakav je on u stvari. Shodno tome, metaznakovi "^" i "$" označava početak i kraj cijelog teksta. Ako je ovaj modifikator naveden, onda će oni pokazivati ​​na početak i kraj svakog reda teksta, respektivno.
s Zadani metaznak " . "ne uključuje znak za prijelaz na red u svoju definiciju. Navođenje ovog modifikatora uklanja ovo ograničenje.
U Uklanja pohlepu regularnog izraza
u Omogućava rad sa regularnim izrazima Ćirilica u UTF-8, inače ne radi ispravno.

php Funkcije za rad sa regularnim izrazima

preg_replace

Pronađite i zamijenite:

Preg_replace (mješoviti $ obrazac, mješoviti $ zamjena, mješoviti $ subjekt [, int $ limit = -1 [, int & $ count]]);

Svaka vrijednost može biti string ili niz, u slučaju slučaja $ predmet niz - vraća se niz, inače string

preg_split

Dijeli string po regularnom izrazu:

Preg_split (string $ pattern, string $ subject [, int $ limit = -1 [, int $ flags = 0]]);

Vraća niz podstringova datog niza predmet koji je razbijen duž granica koje odgovaraju uzorku uzorak.

Top srodni članci