Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

php shprehje të rregullta. Shprehje të rregullta

) Ju tregova një shembull të përdorimit të shprehjeve të rregullta për të gjetur pjesë të caktuara të kodit burimor të një faqeje. Tani do të mësojmë se si t'i shkruajmë ato vetë. Kjo aftësi do t'ju ndihmojë të shkruani, të pastroni tekstin nga fragmente të panevojshme, të kërkoni pjesët e duhura në vëllime të mëdha teksti, etj.

Kjo temë është mjaft e ndërlikuar, por unë do të përpiqem të theksoj shkurtimisht pikat më të rëndësishme. Nuk e di se si do të kem sukses, por shpresoj se mësimi do të jetë i dobishëm.
Pra, le të fillojmë me faktin se ekzistojnë disa funksione për të punuar me shprehje të rregullta në PHP, por tre përdoren më shpesh:

  • preg_replace - kërkoni dhe zëvendësoni tekstin që përputhet me shprehjen e rregullt;
  • preg_match - vetëm një kërkim i rregullt i shprehjeve;
  • preg_split - kërkoni dhe ndani tekstin.

Të paktën, në mësimet e mëparshme i kemi përdorur ato. Ose më mirë, në vend të preg_match kishte preg_match_all, por kjo është në thelb e njëjta gjë, vetëm kjo e fundit nuk e ndërpret kërkimin pas gjetjes së parë. Kjo do të thotë, nëse përdorim preg_match, atëherë nuk do të gjejmë të gjitha dukuritë, por vetëm të parën.

Zgjedhja e funksionit për të përdorur në cilën situatë është mjaft e thjeshtë. Ne duhet të zëvendësojmë - ne përdorim zëvendësimin, si në rastin kur na duhej të hiqnim pjesë të panevojshme të kodit të faqes, mbani mend?

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

Parametri i parë i funksionit është një shprehje e rregullt që përcakton atë që ne kërkojmë. E dyta është ajo me të cilën e zëvendësojmë. E treta - Ku po kërkojmë. Prandaj, këtu morëm variablin $page dhe ia caktuam rezultatin e funksionit preg_replace ku kërkuam të gjitha hyrjet type=checkboxes, si dhe etiketat hapëse dhe mbyllëse. I kemi zëvendësuar me “, domethënë thjesht i kanë fshirë. Shpresoj se gjithçka është e qartë këtu. Do të kalojmë në analizën e vetë shprehjes (parametri i parë i funksionit) pak më vonë.
Kishte gjithashtu një shembull duke përdorur preg_match_all, i cili ishte i dobishëm për të gjetur të gjitha lidhjet në tekstin e mbetur. Atëherë na duheshin lidhje sepse ato përmbanin fjalë kyçe që analizuam. Ja çfarë ndodhi:

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

Përsëri, parametri i parë është një shprehje e rregullt për të gjetur të gjitha lidhjet, të cilat, natyrisht, janë të mbyllura në etiketën "a" (nëse nuk jeni miq me shënjimin html, atëherë lexoni atë). E dyta është një variabël që përmban tekstin që do të kërkohet. Parametri i tretë është një variabël në të cilin vendoset rezultati - $ok. Pas kësaj, mbetet vetëm të kalojmë nëpër të gjithë elementët e nevojshëm $ok për të marrë fjalët kyçe që na duhen. Më vete, duhet thënë se në dalje marrim një grup shumëdimensional. Kjo është arsyeja pse ne e nxjerrim atë në një mënyrë kaq të ndërlikuar: $ok[$j]. Për të parë strukturën e një grupi, përdorni funksionin më poshtë dhe do të kuptoni gjithçka.

Print_r($ok);

Këtu, me sa duket, kemi kuptuar funksionet që kemi përdorur për punë. Tani mbetet vetëm të mësojmë se si të shkruajmë të njëjtat shprehje të rregullta, të cilat janë parametri i parë i secilës prej këtyre metodave. Le të kalojmë tek më e rëndësishmja.

Si të shkruani shprehje të rregullta

Së pari, le të shohim strukturat kryesore. Shprehjet kanë opsione. Ato përcaktohen me një shkronjë dhe shkruhen në fund, paraprihen nga një prerje.

Përveç kësaj, metakarakterët e mëposhtëm mbështeten:

Metakarakteret, nga ana tjetër, mund të kenë modifikues:

Epo, tani mund të kalojmë në analizën e shprehjeve tona të rregullta nga mësimi i fundit. Bazuar në tabelat e mësipërme, le të përpiqemi të kuptojmë se çfarë kemi. Këtu është shprehja:

/^]/i

Shenjat e para dhe të fundit "/" tregojnë se ka një shprehje të rregullt brenda tyre. Në të njëjtën kohë, vendosim "i" pas atij të fundit, ky është një opsion, si në tabelën e parë - të mos jetë sensitive. Brenda vijave të pjerrëta është vetë shprehja e rregullt. Fillon me një shenjë më pak se dhe një etiketë hyrëse, dhe gjithçka më pas derisa një pikë është tekst i thjeshtë për t'u kërkuar. Por vetë pika, dhe personazhet pas saj - kjo është tashmë më interesante. Në këtë rast, ".*?" nënkupton çdo sekuencë karakteresh. Kjo do të thotë, nëse kombinojmë vetëm tekstin dhe këtë ndërtim, atëherë do të zgjedhim të gjithë tekstin pas shfaqjes së parë dhe deri në fund. Për të ndaluar, duhet të plotësoni ose etiketën html mbyllëse "më e madhe se" ose karakterin e linjës së re. Ky dizajn thjesht na jep një mundësi të tillë:

Karakteret në kllapa katrore janë, si të thuash, të lidhur me një OR logjik. Fundi është një shenjë më e madhe se fillimi i vargut.
Kjo është e gjithë shprehja, në të vendosim kushtin e fillimit, të mesit dhe të fundit. Jo e vështirë, apo jo? Këtu është një ilustrim për ta bërë më të qartë:

Le ta zbërthejmë edhe një gjë për t'i bërë të gjitha të qarta. Ne kërkuam lidhje me to:

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

Lexojmë shprehjen. Përsëri, ne fillimisht hedhim poshtë prerjet dhe opsionet. Flamujt "uis" janë vetë-shpjegues, me përjashtim të "u", të cilin nuk e përshkrova - tregon që ne përdorim kodimin Unicode. Nuk ka mbetur shumë. Fillimi është etiketa "a", e cila hapet, pastaj vjen klasa

që do të thotë JO pak a shumë (hapja dhe mbyllja e etiketave html), domethënë ndonjë karakter në këtë rast. Një "+?" i shtohet klasës, që do të thotë se kjo klasë do të jetë e pranishme 1 ose më shumë herë (por të paktën 1 herë me siguri). Dhe pastaj vjen etiketa mbyllëse html për etiketën "a". Brenda lidhjes ka tekst që vendoset nga grupi

Në fund të fundit, ne nuk e dimë se çfarë do të jetë teksti atje, kështu që ne përcaktojmë një grup të tillë. Dhe në fund të etiketës mbyllëse "a":

Vini re se ne i shpëtojmë vijës së pjerrët me një vijë të prapme për ta bërë atë të duket si tekst i thjeshtë.

Phew. Tema është me të vërtetë mjaft komplekse, kërkon praktikë. Ndoshta unë jam duke bërë diçka jo mjaft optimale dhe ju mund të bëni shprehje të tjera të rregullta më korrekte, por unë jam po aq autodidakt sa ju, ndaj mos gjykoni rreptësisht, por ndani opsionet tuaja në komente. Gjithashtu, nëse diçka nuk është e qartë, komentet dhe një faqe kontakti janë në shërbimin tuaj.

Le të fillojmë me atë që është një shprehje e rregullt. Tani përgjigjuni pyetjes sime, a ka një "e" në fjalën "test"? "Ka!" ti thua. Pastaj ju bëj pyetjen e dytë, si e gjetët shkronjën "e" në fjalën "test"? Përgjigja është e qartë, marrim karakterin e parë, pra "t" dhe e krahasojmë me atë që kërkojmë, pra me "e". Nëse nuk janë të barabartë, atëherë marrim karakterin e dytë, domethënë "e", e krahasojmë me atë që kërkojmë, domethënë "e". Voila! Gjeti një ndeshje. Përgjigje: Ka një "e" në fjalën "test".

Tani më përgjigjeni një pyetje tjetër, ku është shprehja e rregullt në këtë shembull? Shpresoj ta keni marrë me mend se shprehja e rregullt këtu është ajo që ne po kërkojmë te fjala "test". Kjo do të thotë, shkronja "e" në këtë shembull është një shprehje e rregullt.

Pse të përdorni shprehje të rregullta në php? Në praktikën time, shprehjet e rregullta janë përdorur, për shembull, për të përcaktuar nëse një adresë e-mail është e mirëformuar. Gjithashtu, shprehje të tilla përdoren për të përcaktuar saktësinë e emrit të përdoruesit dhe fjalëkalimit. Duke përdorur shprehje të rregullta, mund të gjeni adresën në lidhje dhe ta ruani atë. Shumë gjëra që mund të bëni Pasi ta analizoni këtë, mund të identifikoni funksionin kryesor të shprehjeve të rregullta dhe dy ato anësore. Funksioni kryesor, është një kërkim për ndeshjet në një varg. Ato anësore janë ruajtja e ndeshjeve të gjetura dhe zëvendësimi.

Shprehja e parë e rregullt

Teorikisht kuptojmë se si të gjejmë karakterin "e" në fjalën "test", si zbatohet kjo në praktikë? Për të përdorur shprehje të rregullta në php, zakonisht përdoren funksionet e mëposhtme:

preg_match("shprehje e rregullt (modeli)", "ndryshore në të cilën kryhet kërkimi", "Ndryshorja në të cilën ruhet rezultati i kërkimit (parametër opsional)"); - Tipar i përputhjes
preg_replace("shprehje e rregullt (modeli)", "Me çfarë të zëvendësohet përputhja", "ndryshore për të zëvendësuar"); - Funksioni i zëvendësimit

Le të fillojmë të përdorim këto funksione.. Këtu është një shembull i kërkimit të karakterit "e" në fjalën "test":

$a = "test";
if(preg_match("/e/",$a)) echo "u gjet!!";

Kodi përshkruan gjendjen, nëse diçka sipas modelit gjendet në ndryshoren $a, atëherë shfaq mesazhin "found!!" Siç mund ta shihni, modeli ynë është midis dy "/". Në këtë rast, karakteri "/" simbolizon fillimin dhe fundin e modelit tonë. Shpresoj se kjo është e qartë.

E gjithë kjo është sigurisht interesante ... por ky është vetëm modeli ynë, i cili është shumë i thjeshtë, nuk mendoni? Në fund të fundit, rrallë na duhet të gjejmë një karakter në një ndryshore. Në shumicën e rasteve, duhet të gjejmë shumë personazhe, por edhe të panjohur. Si të jesh? Le t'i vendosim vetes një problem dhe të përpiqemi ta zgjidhim atë. Supozoni se kemi një varg të përbërë nga numra dhe një shkronjë e panjohur angleze

Si ta gjeni këtë letër? Mund të ketë ndonjë shkronjë të alfabetit anglez, si ta përcaktoni atë? Ju përgjigjët pyetjes suaj, ka ndonjë shkronjë, domethënë është në rangun nga a në z. Vargjet mund të përdoren në shprehje të rregullta. Nëse nuk e dimë se çfarë karakteri po kërkojmë, por e dimë me siguri se ky karakter është një shkronjë e alfabetit anglez, atëherë hyrja do të jetë si më poshtë:

$a = "123a321";
if(preg_match("//",$a)) echo "u gjet!!";

Vini re se diapazoni është i mbyllur në kllapat "[" "]". Çdo gjë e mbyllur në kllapa të tilla përkufizohet si një karakteri, në këtë rast karakteri varion nga a në z. Nëse duhet të gjejmë jo një shkronjë, por një numër, atëherë hyrja do të jetë si kjo:

$a = "abc1cba";
if(preg_match("//",$a)) echo "u gjet!!";

Dua të vërej gjithashtu se shprehjet e rregullta janë të ndjeshme ndaj shkronjave, kështu që personazhet "A" dhe "a" janë krejtësisht të ndryshëm, për të kërkuar ato dhe ato karaktere, ata shkruajnë kështu:

$a = "123a321";
if(preg_match("//",$a)) echo "u gjet!!";

Ekziston gjithashtu një kërkim për shkronja ruse, i kryer në të njëjtën mënyrë si me anglisht:

$a = "123y321";
if(preg_match("/[a-zA-Z]/",$a)) echo "u gjet!!";

Metakarakteret

Ne kemi mësuar se si të kërkojmë një karakter të panjohur në një varg. Çfarë duhet të bëjmë nëse duhet të gjejmë disa personazhe? Të ashtuquajturat metakaraktere vijnë në shpëtim... Supozoni se kemi një varg me numra, shkronja, si ta përshkruajmë atë në një shabllon? Është e mundur si kjo:

linjë - 123a321
mostër -

Hmm... shablloni me të vërtetë i përshtatet vargut tonë dhe kur kontrollohet për pajtueshmëri, ai do të japë të vërtetën e shumëpritur! Por çfarë rekord i rëndë, nuk mendoni?

Ja si mund ta shkurtoni:

linjë - 123a321
mostër - *

Më duket shumë më e shkurtër Çfarë është simboli "*"? Ky është i njëjti metakarakter, do të thotë që karakteri që përshkruam (domethënë, një karakter që mund të përmbajë numra nga 0 në 9 ose shkronja të alfabetit anglez, nga a në z) mund të përsëritet pafundësisht herë, ose më shumë se një herë. Po Po! Ky metakarakter do të gjejë një përputhje në një variabël bosh, pasi edhe mungesa e karakterit që përshkruam do të kthehet e vërtetë! Mbajeni mend atë

Çfarë metakarakterash të tjerë ka?

Për shembull, metakarakteri "+" Është pothuajse i njëjtë me metakarakterin "*" me një përjashtim të vogël. "*" do të kthehet e vërtetë edhe nëse nuk ka karakter, dhe "+" do të kontrollojë për të paktën një karakter. Kjo do të thotë, nëse vargu kërkon praninë minimale karakter i vetëm pastaj përdorni "+" në vend të "*"

Shpesh përdoret edhe metakarakteri "?". Do të thotë që nuk duhet të ketë më shumë se një karakter kërkimi në varg. Më lejoni t'ju jap disa shembuj për dy metakarakterët e fundit që përshkrova.

Supozoni se duhet të kontrollojmë fjalëkalimin e përdoruesit për korrektësi. Le të mendojmë se çfarë duhet të përmbajë fjalëkalimi i përdoruesit? Epo, së pari, duhet të jetë të paktën një personazh. Së dyti, duhet të përmbajë vetëm numra dhe shkronja të alfabetit anglez, kështu që shprehja e rregullt do të duket si kjo:

$a = "qwerty12345";

Çfarë personazhesh lejojmë? Shkronjat angleze të çdo rasti dhe numrash. Tani përpiquni të lini një rresht bosh në vend të fjalëkalimit.

$a = "";
if(preg_match("/+/",$a)) echo "Fjalëkalimi është i saktë";

Ju nuk do të shihni mesazhin "Fjalëkalimi është i saktë". Pse? Sepse metakarakteri "+" kontrolloi vargun për të paktën një karakter.

Dhe tani një truk i vogël, le t'i hedhim një sy shprehjes sonë, nuk e lejuam, le të themi një hapësirë, apo jo? vendosni një hapësirë ​​në fund të fjalëkalimit dhe ekzekutoni

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Fjalëkalimi është i saktë";

Dhe pse e shohim mesazhin tonë të saktë të fjalëkalimit? Është shumë e thjeshtë... Funksioni preg_match(); ndalon kontrollin e tij në ndeshjen e parë. Domethënë, karakteri "q" i përshtatet modelit që përshkruam dhe gjithçka tjetër nuk është më e rëndësishme për funksionin. Çfarë duhet të bëjmë? Ja se si ta rregulloni atë:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Fjalëkalimi është i saktë";

Duke shtuar "^" në fillim të shprehjes dhe "$" në fund, ne i themi funksionit që modeli duhet të përputhet. të gjitha linjë. Nëse përdorni këtë kod, nuk do ta shihni mesazhin, sepse ka një karakter të pavlefshëm në fund të fjalëkalimit - një hapësirë

Tani ndryshoni metakarakterin "+" në metakarakterin "?". Çfarë mendoni se do të ndodhë? Në mënyrë korrekte, nuk do të ketë asnjë mesazh për saktësinë e fjalëkalimit, pasi fjalëkalimi përmban më shumë se një karakter. Shpresoj të kem shpjeguar siç duhet punën e këtyre tre metakarakterëve të përdorur shpesh

Ndonjëherë "jo" është më mirë

Ne të paktën mësuam se si të kontrollojmë saktësinë e fjalëkalimit, dhe kjo është mirë! Më lejoni t'ju tregoj për një mënyrë tjetër për të kërkuar diçka në një varg. Le të themi se duhet të kontrollojmë mungesën e numrave në varg. Si ta bëjmë atë? Këtu është linja:

(Unë i futa qëllimisht këto personazhe "-_+()" në të në mënyrë që jeta të mos dukej si mjaltë ...) Mund të shkruajmë shprehjen e mëposhtme:

Por duhet ta pranoni, sepse jo gjithmonë e dimë se çfarë karaktere përdoren në varg, por e dimë me siguri që nuk duhet të ketë numra në të! Do të ishte më logjike të shkruani thjesht një shabllon që do të kalonte rreshtat në të cilat Nr shifra, jo ato në të cilat "O Zot sa personazhe te pakuptueshme!!!". Këtu është një shembull i një shprehjeje të kompozuar saktë për detyra të tilla:

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

Si e arritëm këtë? Ne kemi futur simbolin por! pasues "^" ([^0-9]) në fillim tregon se ky karakter do të jetë në varg nuk duhet Shpresoj që kjo të zgjidhet

Epo, le të përmbyllim ngadalë... Unë do të jap dy shembuj me shpjegime, gjatë të cilëve do të mësojmë se si të ruajmë rezultatin e kërkimit në një variabël dhe si të kontrollojmë saktësinë e adresës së postës.

E pashë, e ruajta!

Blogu im

$a = " Blogu im";
preg_match ("/ /", $a);

Në shprehjen tonë të rregullt, ne kemi përshkruar të gjitha karakteret e mundshme që mund të përfshihen në lidhje. Dua t'i kushtoj vëmendje edhe karaktereve të citateve dhe "/" në shprehjen tonë. Çështja është se "/" dhe një kuotë në vetvete karaktere të veçanta. Dhe në mënyrë që shablloni t'i perceptojë ata si personazhe të zakonshëm, ne duhet t'i ekranizojmë ato. Shfaqja bëhet duke shtuar një vijë të prapme përpara karaktereve speciale. Shpresoj se është e qartë

$a = " Blogu im";
preg_match ("/ /", $a, $b);

Epo, në përputhje me rrethanat, është e nevojshme të shtoni një parametër shtesë në formën e një ndryshoreje $b, lidhja e gjetur do të ruhet në të. Ju gjithashtu duhet të dini se rezultati i kërkimit është vendosur në një grup. Pra, ndryshorja $b është një grup. Informacioni që ne kërkojmë është në indeksin 1. Kjo do të thotë se rezultati i kërkimit është në ndryshoren $b. Le të shfaqim rezultatin në ekran:

$a = " Blogu im";
preg_match ("/ /", $a, $b);
jehonë $b;

Adresa e duhur është çelësi i suksesit!

Dhe së fundi, përgjigja e pyetjes, a është e-mail i saktë? Së pari, duhet të dini se cilat karaktere lejohen në adresa? Me sa di unë, personazhet e lejuara përfshijnë:

  • Shkronjat angleze, numrat, "_", "-" ummm, gjithçka duket të jetë ... Ne do të vazhdojmë nga kjo.
  • Më pas kemi "@"
  • Më pas, shkronja angleze
  • Tjetra, pika
  • Dhe përsëri, shkronjat angleze ...

Pra, shprehja e rregullt do të ishte:

$a = " [email i mbrojtur]";
if(preg_match("/^ [email i mbrojtur]+.+$/", $a)) echo "adresa e emailit është e saktë!";
ndryshe echo "adresa e emailit NUK është e saktë!";

Epo ... shpresoj që regjistrime të tilla të mos ju frikësojnë tani, dhe ju mund t'i kuptoni plotësisht ato.

Së fundi, dua të them diçka. Artikulli doli të ishte i rëndë dhe në të njëjtën kohë mbulonte vetëm një pjesë të mundësive. Nëse jeni duke e lexuar këtë fjali, atëherë me shumë mundësi e keni lexuar deri në fund, nga e cila ju falënderojmë shumë

Sa i përket serisë së artikujve mbi zhvillimin e blogjeve cms, pjesa e parë e ciklit shpall të mbyllur! Në të ardhmen e afërt do të fillojmë zbatimin e panelit të administratorit, kështu që mos "ndërroni" Nëse keni ndonjë pyetje, me kënaqësi do t'ju përgjigjem. Të gjitha të mirat për ju, unë kam gjithçka!

Shprehjet e rregullta janë modele të veçanta për kërkimin e një nënvargu në tekst. Me ndihmën e tyre, ju mund të zgjidhni probleme të tilla në një rresht: "kontrolloni nëse vargu përmban numra", "gjeni të gjitha adresat e postës elektronike në tekst", "zëvendësoni disa pikëpyetje të njëpasnjëshme me një".

Le të fillojmë me një mençuri të njohur programimi:

Disa njerëz, kur përballen me një problem, mendojnë: "Po, jam i zgjuar, do ta zgjidh me shprehje të rregullta". Tani ata kanë dy probleme.

Shembuj shabllonesh

Le të fillojmë me disa shembuj të thjeshtë. Shprehja e parë në foton më poshtë kërkon një sekuencë prej 3 shkronjash, ku shkronja e parë është "k", e dyta është çdo shkronjë ruse dhe e treta është "t" në një mënyrë të pandjeshme (për shembull, "kot" ose "CAT" i përshtatet këtij modeli). Shprehja e dytë kërkon tekstin për një kohë në formatin 12:34.

Çdo shprehje fillon me një karakter përcaktues (kufizues në anglisht). Simboli / zakonisht përdoret si ai, por karaktere të tjera që nuk kanë një qëllim të veçantë në shprehjet e rregullta, si ~, # ose @, mund të përdoren. Kufizuesit alternativë përdoren nëse karakteri / mund të shfaqet në shprehje. Më pas vjen shablloni i vargut që po kërkojmë, i ndjekur nga ndarësi i dytë dhe një ose më shumë shkronja flamuri mund të shkojnë në fund. Ata vendosin opsione shtesë kur kërkojnë tekst. Këtu janë shembuj të flamujve:

  • i - thotë se kërkimi duhet të jetë i pandjeshëm ndaj shkronjave të mëdha (sipas parazgjedhjes me ndjeshmëri të madhe)
  • u - thotë se shprehja dhe teksti që kërkohet përdorin kodim utf-8, jo vetëm shkronja latine. Pa të, kërkimi për karaktere ruse (dhe çdo karakter tjetër jo latin) mund të mos funksionojë siç duhet, kështu që duhet ta vendosni gjithmonë.

Vetë shablloni përbëhet nga karaktere të rregullta dhe dizajne të veçanta. Epo, për shembull, shkronja "k" në shprehjet e rregullta do të thotë vetë, por simbolet do të thotë "çdo numër nga 0 në 5 mund të jetë në këtë vend". Këtu është një listë e plotë e karaktereve speciale (në manualin php ata quhen metakarakter), dhe të gjithë karakteret e tjera në shprehjen e rregullt janë të zakonshëm:

Më poshtë do të analizojmë kuptimin e secilit prej këtyre karaktereve (dhe gjithashtu do të shpjegojmë pse shkronja "ё" vendoset veçmas në shprehjen e parë), por tani për tani do të përpiqemi të zbatojmë shprehjet tona të rregullta në tekst dhe të shohim se çfarë ndodh. PHP ka një funksion të veçantë preg_match ($regexp, $text, $match) , i cili merr një shprehje të rregullt, tekst dhe një grup bosh si hyrje. Ai kontrollon nëse teksti përmban një nënvarg që përputhet me modelin e dhënë dhe kthen 0 nëse jo, ose 1 nëse përputhet. Dhe në grupin e kaluar, përputhja e parë e gjetur me shprehjen e rregullt vendoset në elementin me indeks 0. Le të shkruajmë një program të thjeshtë që aplikon shprehje të rregullta në vargje të ndryshme:

Tani që kemi parë shembullin, le të shqyrtojmë shprehjet e rregullta në më shumë detaje.

Kllapa në shprehje të rregullta

Le të përmbledhim se çfarë nënkuptojnë llojet e ndryshme të kllapave:

  • Kllapat kaçurrelë a(1,5) specifikojnë numrin e përsëritjeve të karakterit të mëparshëm - në këtë shembull, shprehja kërkon 1 deri në 5 shkronja të njëpasnjëshme "a"
  • Kllapat katrore nënkuptojnë "ndonjërin nga këto karaktere", në këtë rast, shkronjat a, b, c, x, y, z ose një numër nga 0 në 5. Brenda kllapave katrore, karaktere të tjera speciale si | ose * - ato tregojnë një karakter të rregullt. Nëse ka një karakter ^ në kllapa katrore në fillim, atëherë kuptimi është i kundërt: "çdo karakter, përveç atyre të treguara" - për shembull, [^ac] do të thotë "çdo karakter, përveç a, b ose c" .
  • Në kllapa grupohen personazhet dhe shprehjet. Për shembull, në shprehjen abc+, shenja plus i referohet vetëm shkronjës c, dhe kjo shprehje kërkon fjalë si abc, abcc, abccc. Dhe nëse vendosni kllapa a (bc) + atëherë kuantifikuesi plus i referohet tashmë sekuencës bc dhe shprehja kërkon fjalët abc, abcbc, abcbcbc

Shënim: vargjet e karaktereve mund të specifikohen në kllapa katrore, por mbani mend se shkronja ruse ё është e ndarë nga alfabeti dhe për të shkruar "çdo shkronjë ruse", duhet të shkruani [а-яё] .

bexleshi

Nëse keni shikuar mësime të tjera për shprehjet e rregullta, ndoshta keni vënë re se vija e prapme shkruhet ndryshe kudo. Diku shkruajnë një vijë të pasme: \d , por këtu në shembujt përsëritet 2 herë: \\d . Pse?

Gjuha e shprehjes së rregullt kërkon që ju të shkruani një herë vijën e prapme. Megjithatë, në vargjet e cituar një dhe të dyfishtë në PHP, backslash ka gjithashtu një kuptim të veçantë: një manual për vargjet. Epo, për shembull, nëse shkruani $x = "\$"; atëherë PHP do ta marrë atë si një kombinim të veçantë dhe do të fusë vetëm karakterin $ në varg (dhe motori regex nuk do të dijë për vijën e prapme përpara tij). Për të futur sekuencën \$ në një varg, duhet të dyfishojmë vijën e prapme dhe të shkruajmë kodin si $x = "\\$"; .

Për këtë arsye, në disa raste (ku një sekuencë karakteresh ka kuptim të veçantë në PHP) na kërkohet të dyfishojmë vijën e prapme:

  • Për të shkruar në shprehje të rregullt \$, ne shkruajmë në kodin "\\$"
  • Për të shkruar \\ në shprehje të rregullt, ne dyfishojmë çdo vijë të prapme dhe shkruajmë "\\\\"
  • Për të shkruar një vijë të prapme dhe një numër (\1) në një shprehje të rregullt, vija e prapme duhet të dyfishohet: "\\1"

Në raste të tjera, një ose dy kthesa të kundërta do të japin të njëjtin rezultat: "\\d" dhe "\d" do të fusin një palë \d karaktere në varg - në rastin e parë, 2 kthesa të kundërta janë sekuenca për futjen e një kthese të kundërt. , në rastin e dytë nuk ka sekuencë të veçantë dhe karakteret do të futen siç janë. Ju mund të kontrolloni se cilat karaktere do të futen në varg dhe çfarë do të shohë motori i shprehjeve të rregullta, duke përdorur echo: echo "\$"; . Po, është e vështirë, por çfarë mund të bësh?

Ndërtime të veçanta në shprehje të rregullta

  • \d kërkon çdo shifër të vetme, \D - çdo karakter të vetëm përveç një shifre
  • \w përputhet me çdo shkronjë të vetme (çdo alfabet), shifër ose nënvizim _ . \W përputhet me çdo karakter përveç shkronjës, numrit, nënvizimit.

Gjithashtu, ekziston një kusht i përshtatshëm për të treguar një kufi fjalësh: \b . Ky ndërtim do të thotë që në njërën anë të tij duhet të ketë një karakter që është një shkronjë / numër / nënvizim (\w), dhe në anën tjetër - jo. Epo, për shembull, ne duam të gjejmë fjalën "mace" në tekst. Nëse shkruajmë shprehjen e rregullt /cat/ui , atëherë ajo do të gjejë sekuencën e këtyre shkronjave kudo - për shembull, brenda fjalës "bishë". Është e qartë se kjo nuk është ajo që ne donim. Nëse shprehjes së rregullt i shtojmë një kusht kufitar fjalësh: /\bcat\b/ui , atëherë tani do të kërkohet vetëm fjala e veçantë "cat".

Manual

  • Sintaksa e shprehjeve të rregullta në PHP, përshkrim i detajuar

Kur punoni me tekste në çdo gjuhë programimi moderne, zhvilluesit përballen vazhdimisht me detyrat e kontrollit të të dhënave të futura për përputhjen me modelin e dëshiruar, gjetjen dhe zëvendësimin e fragmenteve të testit dhe operacione të tjera tipike për përpunimin e informacionit simbolik. Zhvillimi i algoritmeve tuaja të verifikimit çon në humbje kohe, papajtueshmëri të kodit të programit dhe kompleksitet në zhvillimin dhe modernizimin e tij.

Zhvillimi i shpejtë i Internetit dhe i gjuhëve të zhvillimit të WEB-së kërkonte krijimin e mjeteve universale dhe kompakte për përpunimin e informacionit të tekstit me një sasi minimale të kodit të kërkuar për këtë. Gjuha PHP, e njohur në mesin e fillestarëve dhe zhvilluesve profesionistë, nuk bën përjashtim. Shprehja e rregullt si gjuhë e shabllonit të tekstit ju lejon të thjeshtoni detyrat e përpunimit të tekstit dhe të zvogëloni kodin e programit me dhjetëra e qindra rreshta. Shumë detyra në përgjithësi janë të pamundura për t'u zgjidhur pa të.

Shprehjet e rregullta në PHP

Gjuha PHP përmban tre mekanizma për të punuar me shprehje të rregullta - "ereg", "mb_ereg" dhe "preg". Më e zakonshme është ndërfaqja "preg", funksionet e së cilës ofrojnë akses në bibliotekën e mbështetjes së shprehjeve të rregullta PCRE, e zhvilluar fillimisht për gjuhën Perl, e cila është e bashkuar me PHP. Funksionet Preg kërkojnë përputhje në një varg teksti të caktuar, sipas një modeli specifik në gjuhën e shprehjes së rregullt.

Bazat e sintaksës

Në kuadrin e një artikulli të shkurtër, është e pamundur të përshkruhet në detaje e gjithë sintaksa e shprehjeve të rregullta; ekziston një literaturë e veçantë për këtë. Ne do të japim vetëm elementët kryesorë për të treguar mundësitë e gjera për zhvilluesin dhe për të kuptuar shembujt e kodit.

B është përcaktuar zyrtarisht shumë e vështirë, dhe për këtë arsye ne do të thjeshtojmë përshkrimin. Shprehja e rregullt është një varg teksti. Ai përbëhet nga një model i kufizuar dhe një modifikues që tregon se si të përpunohet. Është e mundur të përfshihen alternativa dhe përsëritje të ndryshme në shabllone.

Për shembull, në shprehje /\d(3)-\d(2)-\d(2)/m kufizuesi do të jetë «/» , e ndjekur nga modeli dhe simboli "m" do të jetë një modifikues.

Fuqia e plotë e shprehjeve të rregullta është e koduar me metakaraktere. Metakarakteri kryesor i gjuhës është vija e prapme - "\". Ai ndryshon llojin e personazhit që e ndjek atë (d.m.th., një personazh i rregullt bëhet një metakarakter dhe anasjelltas). Një tjetër metakarakter i rëndësishëm është prerja përpara "|", e cila specifikon modele alternative. Më shumë shembuj të metakaraktereve:

PHP, kur përpunon shprehje të rregullta, trajton një hapësirë ​​si një karakter të veçantë domethënës, kështu që shprehjet ABCWHERE dhe ABCWHERE janë të ndryshme.

Nënmodelët

Në PHP, nënmodelët e rregullt dallohen me kllapa dhe ndonjëherë quhen "nënshprehje". Kryeni funksionet e mëposhtme:

    Përzgjedhja e alternativave. Për shembull, shabllon nxehtësi(disa|zog|) përputhet me fjalët "nxehtësia", "zogu i zjarrit" dhe "i pjekur". Dhe pa kllapa, do të jetë vetëm një varg bosh, "zog" dhe "i nxehtë".

    Nënmodel "emocionues". Kjo do të thotë që nëse një nënvarg përputhet në model, atëherë të gjitha ndeshjet kthehen si rezultat. Për qartësi, le të marrim një shembull. Duke pasur parasysh shprehjen e rregullt të mëposhtme: fituesi merr ((ari|i praruar)(medalja|kupa)) - dhe një varg për të kërkuar përputhje: "Fituesi merr medaljen e artë". Përveç frazës origjinale, kërkimi do të rezultojë në: "medalje të artë", "medalja", "ari".

Operatorët e përsëritjes (kualifikues)

Gjatë përpilimit të shprehjeve të rregullta, shpesh është e nevojshme të analizohen përsëritjet e numrave dhe karaktereve. Ky nuk është problem nëse nuk ka shumë përsëritje. Por çfarë të bëjmë kur nuk e dimë numrin e saktë të tyre? Në këtë rast, duhet të përdoren metakarakter të veçantë.

Për të përshkruar përsëritjet, përdoren kuadrifikues - metakarakter për të vendosur sasinë. Kuadifikuesit janë dy llojesh:

  • e përgjithshme, e mbyllur në kllapa;
  • shkurtuar.

Kuantifikuesi i përgjithshëm specifikon numrin minimal dhe maksimal të përsëritjeve të lejuara të elementit si dy numra në kllapa kaçurrelë, si ky: x(2.5). Nëse numri maksimal i përsëritjeve është i panjohur, argumenti i dytë hiqet: x(2,).

Kuantifikuesit e shkurtuar janë karaktere për përsëritjet më të zakonshme për të shmangur mbingarkimin e sintaksës. Zakonisht përdoren tre shkurtesa:

1. * - zero ose më shumë përsëritje, që është e barabartë me (0,).

2. + - një ose më shumë përsëritje, d.m.th.,).

3.? - zero ose vetëm një përsëritje - (0.1).

Shembuj të shprehjeve të rregullta

Për ata që po mësojnë shprehje të rregullta, shembujt janë mësimi më i mirë. Këtu janë disa që tregojnë potencialin e tyre të madh me një minimum përpjekjeje. Të gjithë kodet e programimit janë plotësisht të pajtueshëm me versionet PHP 4.x dhe më të larta. Për një kuptim të plotë të sintaksës dhe përdorimin e të gjitha veçorive të gjuhës, rekomandojmë librin Regular Expressions nga J. Friedl, ku sintaksa është e mbuluar plotësisht dhe ka shembuj të shprehjeve të rregullta jo vetëm në PHP, por edhe për Python, Perl, MySQL, Java, Ruby dhe C#.

Kontrollimi i korrektësisë së adresës së postës elektronike

Detyrë. Ekziston një faqe interneti që i kërkon vizitorit një adresë emaili. Shprehja e rregullt duhet të kontrollojë nëse adresa e marrë është e saktë përpara se të dërgojë mesazhet. Kontrolli nuk garanton që kutia postare e specifikuar ekziston vërtet dhe pranon letra. Por ajo mund të eliminojë adresat e gabuara qëllimisht.

Zgjidhje. Ashtu si me çdo gjuhë programimi, shprehjet e rregullta të vërtetimit të adresës së emailit mund të zbatohen në PHP në mënyra të ndryshme, dhe shembujt në këtë artikull nuk synojnë të jenë opsioni përfundimtar dhe i vetëm. Prandaj, në secilin rast, ne do të ofrojmë një listë të kërkesave që duhet të merren parasysh gjatë programimit, dhe zbatimi specifik varet plotësisht nga zhvilluesi.

Pra, shprehja që kontrollon vlefshmërinë e emailit duhet të kontrollojë kushtet e mëposhtme:

  1. Prania e simbolit @ në vargun burimor dhe mungesa e hapësirave.
  2. Pjesa e domenit të adresës, pas simbolit @, përmban vetëm karaktere të vlefshme për emrat e domeneve. E njëjta gjë vlen edhe për emrin e përdoruesit.
  3. Kur vërtetoni një emër përdoruesi, është e nevojshme të zbuloni praninë e karaktereve speciale, të tilla si një apostrof ose karaktere të tilla janë potencialisht të rrezikshme dhe mund të përfshihen në sulme të tilla si injeksionet SQL. Shmangni adresa të tilla.
  4. Emrat e përdoruesve lejojnë vetëm një pikë, e cila nuk mund të jetë karakteri i parë ose i fundit në një varg.
  5. Emri i domenit duhet të përmbajë të paktën dy dhe jo më shumë se gjashtë karaktere.

Një shembull që merr parasysh të gjitha këto kushte mund të shihet në figurën më poshtë.

Verifikoni URL-të

Detyrë. Kontrolloni nëse një varg teksti i dhënë është i vlefshëm Përsëri, shprehjet e rregullta të vlefshmërisë së URL-së mund të zbatohen në mënyra të ndryshme.

Zgjidhje. Versioni ynë përfundimtar duket si ky:

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

Tani le të analizojmë përbërësit e tij në më shumë detaje, duke përdorur figurën.

Kontrollimi i numrave të kartës së kreditit

Detyrë.Është e nevojshme të kryhet verifikimi i saktësisë së numrit të futur të kartës plastike të sistemeve më të zakonshme të pagesave. Opsioni vetëm në hartë konsiderohet

Zgjidhje. Kur krijoni një shprehje, është e nevojshme të merret parasysh prania e mundshme e hapësirave në numrin e futur. Shifrat e numrit në kartë ndahen në grupe për lexim dhe diktim më të lehtë. Prandaj, është e natyrshme që një person mund të përpiqet të fusë një numër në këtë mënyrë (d.m.th. duke përdorur hapësira).

Të shkruash një shprehje të përgjithshme që merr parasysh hapësirat dhe vizat e mundshme është më e vështirë sesa thjesht të hedhësh poshtë të gjithë karakteret përveç numrave. Prandaj, rekomandohet përdorimi i metakarakterit /D në shprehje, i cili heq të gjitha karakteret përveç shifrave.

Tani mund të shkoni drejtpërdrejt te kontrollimi i numrit. Të gjitha kompanitë e kartave të kreditit përdorin një format unik të numrit. Shembulli e përdor këtë, dhe klienti nuk ka nevojë të fusë emrin e kompanisë - përcaktohet nga numri. Kartat Visa gjithmonë fillojnë me 4 dhe janë 13 ose 16 shifra. MasterCard fillon në rangun 51-55 me një gjatësi prej 16. Si rezultat, marrim shprehjen e mëposhtme:

Para përpunimit të porosisë, mund të kontrolloni gjithashtu shifrën e fundit të numrit, e cila llogaritet duke përdorur algoritmin Luhn.

Kontrollimi i numrave të telefonit

Detyrë. Kontrollimi i saktësisë së numrit të telefonit të futur.

Zgjidhje. Numri i shifrave në numrat e telefonit fiks dhe celular ndryshon në mënyrë të konsiderueshme nga vendi në vend, kështu që nuk është e mundur të vërtetohet universalisht një numër telefoni duke përdorur shprehje të rregullta. Por numrat ndërkombëtarë kanë një format të rreptë dhe janë të shkëlqyera për kontrollimin e modeleve. Për më tepër, gjithnjë e më shumë operatorë telefonikë kombëtarë po përpiqen të respektojnë një standard të vetëm. Struktura e numrit është si më poshtë:

+CCC.NNNNNNNNNNxEEEE, ku:

C është një kod shteti 1-3 shifror.

N - numër deri në 14 shifra të gjata.

E është një shtesë opsionale.

Shenja plus është një element i kërkuar dhe shenja x është e pranishme vetëm kur nevojitet një shtrirje.

Si rezultat, kemi shprehjen e mëposhtme:

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

Numrat në një gamë

Detyrë.Është e nevojshme të sigurohet që një numër i plotë nga një gamë e caktuar përputhet. Për më tepër, është e nevojshme që shprehjet e rregullta të gjejnë vetëm numra nga një varg vlerash.

Zgjidhje. Këtu janë disa shprehje për disa nga rastet më të zakonshme:

Kërkimi i adresës IP

Detyrë. Duhet të përcaktoni nëse vargu i dhënë është një adresë IP e vlefshme në formatin IPv4 në intervalin 000.000.000.000-255.255.255.255.

Zgjidhje. Ashtu si me çdo detyrë PHP, një shprehje e rregullt ka shumë ndryshime. Për shembull, kjo:

Kontrolli online i shprehjeve

Kontrollimi i saktësisë së shprehjeve të rregullta mund të jetë i vështirë për programuesit fillestarë për shkak të kompleksitetit të sintaksës, e cila ndryshon nga gjuhët e programimit "të rregullta". Për të zgjidhur këtë problem, ka shumë testues të shprehjeve në internet që e bëjnë të lehtë kontrollimin e korrektësisë së shabllonit të krijuar në tekst real. Programuesi fut një shprehje dhe të dhëna për verifikim dhe shikon menjëherë rezultatin e përpunimit. Zakonisht ekziston edhe një seksion referimi, i cili përshkruan në detaje shprehjet e rregullta, shembujt dhe ndryshimet e zbatimit për gjuhët më të zakonshme të programimit.

Por besimi i plotë në rezultatet e shërbimeve në internet nuk rekomandohet për të gjithë zhvilluesit që përdorin PHP. Një shprehje e rregullt e shkruar dhe e testuar personalisht përmirëson aftësitë dhe siguron që të mos ketë gabime.

Shprehjet e rregullta janë një mjet shumë i fuqishëm, por në të njëjtën kohë i vështirë për t'u kuptuar, për përpunimin e vargjeve. Unë do të përshkruaj pikat kryesore. Një shprehje e rregullt është një model vargu. Sipas këtij shablloni, ju mund të kërkoni për dukuritë, të bëni një zëvendësim, të kontrolloni përputhshmërinë me shabllonin.

Rregullat për hartimin e një shablloni (modeli)

Kufijtë e modeleve duhet të shënohen me karaktere të caktuara, shpesh duke përdorur " / ", por unë preferoj të përdor" # " sepse bollëku i prerjeve përpara / mbrapa mund të ngarkojë në sy, dhe "grilat" zakonisht nuk përdoren askund tjetër. Pra: " #Këtu Trupi iRregullt i Shprehjes#"

Kllapat përdoren brenda shprehjes së rregullt - këto janë nënshprehje që mund të manipulohen, për shembull:

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

Kjo shprehje synon të marrë parametra në një varg URL. Në fillim të rreshtit ka një karakter të veçantë " ^ " - kjo do të thotë fillimi i rreshtit. Më pas vjen " /katalog/" - këtu nuk ka karaktere të veçanta, është vetëm tekst që duhet të përmbahet në rresht. Më pas takuam kllapat, domethënë arritëm te nënshprehja e parë. Kllapat katrore tregojnë grupin e karaktereve që mund të jenë në rresht në ky vend. Shenja " - "do të thotë numërim. Shenjë" \ " i shpëton karaktereve të veçanta. Kështu, në nënshprehjen e parë mund të kemi shkronja të mëdha dhe të vogla të alfabetit latin, numrat nga 0 deri në 9, një nënvizim, një vizë dhe një pikë. Një vizë dhe një pikë janë karaktere të veçanta, por këtu ato janë shpëtuar, kështu që këtu janë vetëm karaktere. Pas kllapave vjen shenja " + " - kjo do të thotë se karakteri i mëparshëm (dhe ne kemi këtë grup karakteresh të dhëna në kllapa katrore) mund të shkojë 1 ose më shumë herë. Pastaj vjen " / "është thjesht një karakter, dhe një nënshprehje e dytë e ngjashme. Pastaj vjen " \.html"që do të thotë teksti" .html". Dhe pastaj personazhe speciale" .* "një pikë do të thotë çdo karakter, dhe një yll çdo numër i karakterit të mëparshëm. Kjo është, pas " .html“Çdo gjë mund të shkojë.

Specifikimi i sasisë, sasiore

Më lart, ne kemi konsideruar tashmë simbole të tilla që tregojnë numrin e simboleve të mëparshme, si p.sh + dhe * . Këtu janë të gjitha mundësitë për të specifikuar sasinë:

Personazhe të veçanta

Ekzistojnë shkurtesa të veçanta për disa grupe karakteresh:

"lakmia"

Merrni parasysh konceptin e lakmisë së shprehjes së rregullt. Për shembull, ekziston një rresht:

#()#

Leximi: nënshprehje:

Gjithçka duket të jetë e saktë, nënshprehja përshtatet në:

Por përshtatet gjithashtu:

Do ta marrim, sepse. shprehjet e rregullta janë "të pangopur" si parazgjedhje. Ju mund të hiqni lakminë me modifikuesin " U", si kjo:

#()#U

Modifikuesit

Shprehjet e rregullta mund të ndiqen nga modifikues: " #HereRegularExpressionBody#HereModifiers"Llojet e modifikuesve:

i Aktivizon modalitetin e pandjeshëm ndaj shkronjave të vogla, d.m.th. shkronjat e mëdha dhe të vogla në shprehje nuk ndryshojnë.
m Tregon që teksti që kërkohet duhet të trajtohet si rreshta të shumëfishtë. Si parazgjedhje, motori i shprehjeve të rregullta e trajton tekstin si një rresht të vetëm, pavarësisht se çfarë është në të vërtetë. Prandaj, metakarakteret "^" dhe "$" tregoni fillimin dhe fundin e të gjithë tekstit. Nëse ky modifikues është i specifikuar, atëherë ata do të tregojnë përkatësisht fillimin dhe fundin e çdo rreshti të tekstit.
s Metakarakteri i paracaktuar është " . " nuk përfshin një karakter të linjës së re në përkufizimin e tij. Specifikimi i këtij modifikuesi e heq këtë kufizim.
U Heq lakminë e një shprehjeje të rregullt
u Aktivizon shprehjet e rregullta për të punuar me të cirilik në UTF-8 përndryshe nuk funksionon si duhet.

php funksionet për të punuar me shprehje të rregullta

preg_zëvendësoj

Kërko dhe zëvendëso:

preg_replace (model i përzier $, zëvendësim i përzier $, i përzier $subject [, int $limit = -1 [, int &$count ]]);

Çdo vlerë mund të jetë një varg ose një grup, në rast $subjekt array - kthehet një grup, përndryshe një varg

preg_ndarje

Ndan një varg me shprehje të rregullt:

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

Kthen një grup të përbërë nga nënvargje të vargut të dhënë subjekt, e cila është e ndarë përgjatë kufijve që përputhen me modelin model.

Artikujt kryesorë të lidhur