Bilo koji znak u php regularnim izrazima. Regularni izrazi (uzorci)

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

Ova tema je dosta teška, ali pokušat ću kratki oblik najviše osvijetliti važne točke. Ne znam koliko ću uspjeti, ali se nadam da će lekcija biti korisna.
Dakle, počnimo s činjenicom da postoji nekoliko funkcija za rad s regularnim izrazima u PHP-u, ali najčešće se koriste tri:

  • preg_replace — traži i zamijeni tekst koji odgovara regularnom izrazu;
  • preg_match - samo obična pretraga;
  • preg_split - pretraži i podijeli tekst.

Po najmanje, u prethodnim lekcijama koristili smo upravo njih. Točnije, umjesto preg_match bilo je preg_match_all, ali to je u biti ista stvar, samo što potonji ne prekida pretragu nakon prvog pronalaska. Odnosno, ako koristimo preg_match, nećemo pronaći sve pojave, već samo prvu.

Odabir funkcije koju ćete koristiti u kojoj situaciji vrlo je jednostavan. Moramo zamijeniti - koristimo replace, kao u slučaju kada smo trebali ukloniti nepotrebne dijelove koda stranice, sjećate se?

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

Prvi parametar funkcije je regularni znak koji određuje što tražimo. Drugo je ono čime ga zamjenjujemo. Treće - Gdje gledamo? Stoga smo ovdje uzeli varijablu $page i dodijelili joj rezultat funkcije preg_replace gdje smo tražili sve input type=checkbox, kao i oznake za otvaranje i zatvaranje. Zamijenili su ih sa ", odnosno jednostavno su ih izbrisali. Nadam se da je ovdje sve jasno. Nešto kasnije ćemo prijeći na analizu samog izraza (prvog parametra funkcije).
Tu je i primjer korištenja preg_match_all, što je bilo korisno za pronalaženje svih poveznica u preostalom tekstu. Tada su nam bile potrebne veze jer su sadržavale ključne riječi, koje smo analizirali. Evo što se dogodilo:

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

Prvi parametar opet je regularni izraz za pronalaženje svih veza koje su prirodno zatvorene u oznaci "a" (ako niste upoznati s html označavanjem, pročitajte). Druga je varijabla koja sadrži tekst koji će se pretraživati. Treći parametar je varijabla u koju se stavlja rezultat - $ok. Nakon ovoga, sve što preostaje je proći kroz sve potrebne elemente $ok da dobijemo ključne zahvate koji su nam potrebni. Zasebno treba reći da na izlazu dobivamo višedimenzionalni niz. Zato smo ga prikazali na tako složen način: $ok[$j]. Da biste vidjeli strukturu niza, upotrijebite funkciju u nastavku i sve ćete razumjeti.

Ispis_r($ok);

Čini se da smo posložili funkcije koje smo koristili za svoj rad. Sada preostaje samo naučiti kako napisati te iste regularne izraze, koji su prvi parametar svake od ovih metoda. Prijeđimo na ono najvažnije.

Kako napisati pravilne rečenice

Prvo, pogledajmo osnovne strukture. Izrazi imaju opcije. Određeni su jednim slovom i ispisani na kraju, a ispred njih stoji kosa crta.

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

Metaznakovi, pak, mogu imati modifikatore:

Pa, sada možemo prijeći na analizu naših uobičajenih obrazaca iz prošle lekcije. Na temelju gore navedenih znakova, pokušajmo shvatiti što imamo. Evo izraza:

/^]/i

Prva i zadnja kosa crta “/” označavaju da se unutar njih nalazi regularni izraz. U isto vrijeme, nakon posljednjeg stavljamo "i", ovo je opcija, kao u prvoj tablici - ne uzimajte u obzir velika i mala slova. Unutar kosih crta je sam pravilan niz. Započinje znakom manje od i oznakom za unos, a sve što dolazi nakon toga do znaka točke samo je običan tekst za traženje. Ali sama točka i simboli iza nje su zanimljiviji. U ovom slučaju, konstrukcija ".*?" znači bilo koji niz znakova. Odnosno, ako kombiniramo samo tekst i ovu konstrukciju, tada ćemo odabrati sav tekst nakon prvog pojavljivanja i do kraja. Da biste prestali, morate naići na završnu HTML oznaku "više od" ili znak novog retka. Ovaj dizajn nam daje upravo takvu priliku:

Znakovi u uglatim zagradama povezani su logičkim ILI. Kraj je znak veće ILI početak retka.
To je sav izraz, u njemu postavljamo početni uvjet, srednji i krajnji uvjet. Nije teško, zar ne? Evo ilustracije radi jasnoće:

Pogledajmo još jednu stvar da sve učvrstimo. Potražili smo poveznice s njima:

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

Čitamo izraz. Opet, prvo odbacujemo kose crte i opcije. Oznake "uis" su same po sebi razumljive, osim za "u", koju nisam opisao - pokazuje da koristimo Unicode kodiranje. Nije ostalo puno. Početak je oznaka "a", koja se otvara, zatim dolazi klasa

što znači NIJE veće ili manje od (otvarajuće i zatvarajuće HTML oznake), odnosno bilo koji znakovi u ovom slučaju. “+?” se dodaje klasi, što znači da će ova klasa biti prisutna 1 ili više puta (ali barem 1 put sigurno). Zatim dolazi završna html oznaka za oznaku "a". Unutar veze nalazi se tekst koji je odredila grupa

Uostalom, ne znamo kakav će tekst tamo biti, pa definiramo takvu grupu. I na kraju je završna oznaka "a":

Imajte na umu da kosu crtu izbjegavamo pomoću obrnute kose crte tako da se percipira kao jednostavan tekst.

Fuj. Tema je stvarno dosta složena, zahtijeva vježbu. Možda radim nešto ne baš optimalno i moguće je stvoriti druge, ispravnije regularne izraze, ali ja sam samouk kao i vi, stoga nemojte strogo suditi, već podijelite svoje mogućnosti u komentarima. Također, ako nešto nije jasno, komentari i kontakt stranica su vam na usluzi.

Regularni izrazi su vrlo moćan, ali u isto vrijeme teško razumljiv alat za obradu nizova. Opisat ću glavne točke. Regularni izraz je uzorak niza. Pomoću ovog predloška možete pretraživati ​​pojavljivanja, vršiti zamjene i provjeravati usklađenost s predloškom.

Pravila za izradu uzorka

Granice predloška moraju biti označene određenim simbolima, često koristeći " / ", ali radije koristim " # " zato što vam obilje kosih crta naprijed/natrag može zaslijepiti oči, a hash oznake se obično ne koriste nigdje drugdje. Dakle: " #HereBodyRegularExpression#"

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

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

Ovaj izraz je dizajniran za dobivanje parametara u nizu URL. Na početku retka nalazi se poseban znak " ^ " - ovo znači početak retka. Slijedi " /katalog/" - ovdje nema posebnih znakova, ovo je samo tekst koji bi trebao biti sadržan u retku. Zatim smo naišli na zagrade, tj. došli smo do prvog podizraza. Uglate zagrade označavaju mnogo znakova koji mogu biti u retku na ovom mjestu. Znak " - " znači nabrajanje. Znak " \ " izbjegava posebne znakove. Dakle, u prvom podizrazu možemo imati VELIKA i mala slova latinične abecede, brojeve od 0 do 9, podvlaku, crticu i točku. Crtica i točka su posebni znakovi, ali ovdje su escaped, tako da su to samo simboli iza uglastih zagrada nalazi se znak ". + " - to znači da se prethodni znak (a za nas je to skup znakova navedenih u uglatim zagradama) može pojaviti 1 ili više puta. Zatim dolazi " / " je samo simbol i sličan drugi podizraz. Zatim dolazi " \.html"što znači tekst" .html". A zatim posebni znakovi " .* "Točka znači bilo koji znak, a zvjezdica znači bilo koju količinu prethodnog znaka. To jest, nakon " .html“Sve može proći.

Označavanje količine, kvantifikatori

Gore smo već razmotrili takve simbole koji označavaju broj prethodnih simbola, kao što je + I * . Ovdje su sve mogućnosti za određivanje količine:

Posebni znakovi

Za neke grupe znakova postoje posebne kratice:

"Pohlepa"

Pogledajmo koncept regularnog izraza pohlepa. Na primjer, postoji redak:

#()#

Čitamo: podizraz:

Čini se da je sve točno, podizraz odgovara:

Ali također odgovara:

To ćemo i dobiti, jer... Regularni izrazi su pohlepni prema zadanim postavkama. Pohlepu možete ukloniti pomoću modifikatora " U", ovako:

#()#U

Modifikatori

Nakon regularni izraz modifikatori mogu ići: " #HereBodyRegularExpression#HereModifiers"Vrste modifikatora:

ja Omogućuje način rada koji ne razlikuje velika i mala slova, tj. velika i mala slova u izrazu se ne razlikuju.
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, metakarakteri "^" i "$" označavaju početak i kraj cijelog teksta. Ako je ovaj modifikator naveden, oni će označavati početak i kraj svakog retka teksta.
s Zadani metakarakter je " . " ne uključuje znak novog retka u svojoj definiciji. Navođenje ovog modifikatora uklanja ovo ograničenje.
U Uklanja regularni izraz pohlepe
u Omogućuje rad s regularnim izrazima Ćirilica u UTF-8, inače ne radi ispravno.

php Funkcije za rad s regularnim izrazima

preg_zamijeniti

Traži i zamijeni:

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

Svaka vrijednost može biti niz ili niz, u slučaju velikih i malih slova $predmet niz - vraća se niz, inače niz

preg_split

Rastavlja niz koristeći regularni izraz:

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

Vraća niz koji se sastoji od podnizova zadanog niza subjekt, koji je podijeljen duž granica koje odgovaraju uzorku uzorak.

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čit, 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 ovom primjeru je uobičajeni 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. Postoje mnoge 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 trebamo pronaći mnoge likove, a također i nepoznate. Kako to može 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žete učiniti ovo:

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! Zapamti 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 smo dopustili? Engleska slova u bilo kojem slučaju i brojevi. 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 uzorku 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 sve linija. 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 bolje "ne".

Barem smo naučili kako 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? Unijeli 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. Adaptacija zaslona provodi se dodavanjem obrnute kose crte prije 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 znati 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 što imam!