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

Shprehje të rregullta në php. Shprehje të rregullta (modele)


Një nga më të fuqishmet dhe karakteristika të dobishme Gjuha PHP - mbështetje për shprehjet e rregullta. Shumë programues, fillestarë dhe mjaft me përvojë, janë të frikësuar nga kompleksiteti i dukshëm dhe ndërlikimi i gjuhës së shprehjes së rregullt. Por mund t'ju siguroj - ia vlen. Përdorimi i shprehjeve të rregullta thjeshton shumë punën e përpunimit të teksteve dhe të dhënave të strukturuara dobët.


Shprehje të rregullta- Këto janë shprehje të shkruara në një gjuhë të veçantë. Mos u shqetësoni, gjuha është mjaft e lehtë për t'u kuptuar;


Unë mendoj se ju keni hasur në mënyrë të përsëritur situata ku keni tekst (për shembull, në Microsoft Word) dhe ju duhet të gjeni diçka të rëndësishme në të. Nëse e dini se çfarë saktësisht po kërkoni, gjithçka është e thjeshtë: thirrni dialogun e kërkimit, futni fjalën e kërkimit, shtypni butonin dhe voila - teksti gjendet.


Por çfarë do të bëni nëse e dini paraprakisht vetëm llojin e informacionit që kërkoni? Për shembull, ju jeni përballur me detyrën për të gjetur të gjitha adresat Email në një dokument prej disa qindra fletësh. Disa do ta shikojnë dokumentin me dorë, disa do të fusin qenin (@) në kërkim dhe do ta kërkojnë. Pajtohem - të dyja opsionet janë punë mbrapsht, pa falënderim.

Këtu vijnë në shpëtim shprehjet e rregullta. Në një farë përafrimi, shprehjet e rregullta mund të krahasohen me maska ​​ose shabllone që mbivendosen në tekst: nëse teksti përputhet me maskën, atëherë ky është fragmenti i dëshiruar. Por përpara se të shqyrtojmë përdorimin e shprehjeve të rregullta, do të njihemi me sintaksën e tyre.

Shprehja e rregullt është varg teksti të përpiluara sipas ligjeve dhe rregullave të caktuara. Një varg përbëhet nga karaktere dhe grupe karakteresh, metakarakterësh, kuantifikues dhe modifikues.

Nën simbolet në në këtë rast kuptohet çdo simbol i çdo alfabeti. Dhe jo vetëm ato të lexueshme. Ju mund të futni lehtësisht një karakter të palexueshëm në një shprehje për ta bërë këtë, thjesht duhet të dini kodin e tij në formë heksadecimal. Për shembull:

// karaktere të lexueshme a E // karaktere dhe kode të palexueshme \x41 - njësoj si shkronja "A" \x09 - karakter tab

Një grup personazhesh është disa karaktere të shkruara në mënyrë sekuenciale:

ACZms abvg

Më lejoni të tërheq menjëherë vëmendjen tuaj për faktin se "hapësira" në shprehjet e rregullta konsiderohet gjithashtu si simbol i rëndësishëm, ndaj kini kujdes kur shkruani shprehje. Për shembull, këto grupe karakteresh janë shprehje të NDRYSHME:

ABC KU ABC KU

Elementi tjetër i gjuhës janë metakarakteret. Parashtesa "meta" do të thotë që këto simbole përshkruajnë disa simbole të tjera ose grupet e tyre. Tabela përshkruan metakarakteret kryesore të gjuhës së shprehjes së rregullt:

Metakarakteret për detyrën personazhe të veçanta
() Kllapa. Përkufizon shprehjet e mbivendosura.
| Metakarakteri i përzgjedhjes
^ Metakarakteri i fillimit të rreshtit
$ Metakarakteri i fundit të rreshtit
\n Karakteri i furnizimit të linjës (kodi heks 0x0A)
\r Karakteri i kthimit të karrocës (kodi heks 0x0D)
\t Karakteri i skedës (kodi heks 0x09)
\xhh Futja e një karakteri me kod heksadecimal 0xhh, për shembull \x42 do të futë shkronjën latine "B"
Metakaraktere për specifikimin e grupeve të personazheve
. Pika. Çdo personazh.
\d Shifra (0-9)
\D Jo një numër ( çdo personazh përveç karaktereve 0-9)
\s Karakteri bosh (zakonisht hapësira dhe skeda)
\S Karakter jo bosh (të gjitha përveç karaktereve të identifikuar nga metakarakteri \s)
\w Një karakter "fjalori" (një karakter që përdoret me fjalë. Zakonisht të gjitha shkronjat, të gjithë numrat dhe një nënvizim ("_"))
\ W Të gjithë përveç karaktereve të përcaktuara nga metakarakteri \w

Metakarakteret nga gjysma e dytë e tabelës janë shumë të lehta për t'u mbajtur mend. "d" - shifër (shifër), "s" - simbol (simbol), "w" - fjalë (fjalë). Nëse shkronja është e madhe, atëherë duhet të shtoni "NUK" në përshkrimin e grupit.

Le të marrim për shembull tekstin "Fnela e kuqe ka numrat 1812, dhe fanella jeshile ka numrat 2009". Le të shohim shembuj të shprehjeve më të thjeshta të rregullta:

\d\d\d\d - do të gjejë 1812 dhe 2009 \D - do të gjejë të gjitha shkronjat, hapësirat dhe shenjat e pikësimit \s - do të gjejë të gjitha hapësirat në tekst.

Por viti në shembullin tonë mund të shkruhet jo me katër, por me dy shifra, fjalët mund të kenë thjerrëza të tjera, etj. Nëngrupet e karaktereve që janë specifikuar duke përdorur kllapa katrore mund të ndihmojnë këtu:

Do të thotë çdo shifër (njëlloj si \d) - do të thotë një shifër çift - do të thotë çdo simbol i alfabetit latin (në çdo rast) ose shifër.

Për shembull, shprehja \d\d\d në vargun e testit do të gjejë vetëm 1812, por jo 2009. Kjo shprehje duhet lexuar si "gjeni të gjitha sekuencat me katër shifra ku shifra e fundit është 0,2,4,6 ose 8".

Gjithçka që na ka mbetur për të përmendur janë kuantifikuesit dhe modifikuesit.

Kuantifikuesështë një ndërtim i veçantë që përcakton se sa herë duhet të shfaqet një personazh ose grup personazhesh. Kuantifikuesi shkruhet në kllapa kaçurrelë "()". Dy formate regjistrimi janë të mundshme: preciz dhe diapazon. E sakta formati është shkruar kështu:

Këtu X është numri i herëve që simboli ose grupi i mëparshëm duhet të përsëritet. Për shembull shprehja

Forma e dytë e regjistrimit është diapazoni. Regjistruar si

(X, Y) // ose (,Y) // ose (X,)

ku X është minimumi dhe Y është shuma maksimale përsëritjet. Për shembull:

lexohet si "dy deri në katër shifra të shkruara në sekuencë". Nëse një nga kufijtë nuk është specifikuar, atëherë nuk supozohet asnjë kufizim. Për shembull:

\w(3,) - tre ose më shumë shkronja. \d(,5) - nuk ka fare numra, ose ka, por jo më shumë se pesë.

Kuantifikuesit mund të aplikohen ose për një karakter të vetëm ose një grup:

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

Ky ndërtim do të zgjedhë nga teksti të gjitha fjalët ruse nga një, dy ose tre shkronja(për shembull, "ose", "jo", "unë", "Unë shkoj", etj.)

Përveç kllapave kaçurrelë, ka edhe tre metakarakter të tjerë kuantifikues: "*" (yll), "+" (plus) dhe "?" (pyetje). Ato përdoren në rastet kur numri minimal dhe maksimal i përsëritjeve të kërkuara nuk dihet paraprakisht. Për shembull, kur kërkoni për adresat e emailit, nuk mund të tregoni paraprakisht se sa karaktere do të jenë në emrin e përdoruesit (përpara "qen") dhe sa do të jenë në emrin e domenit (pas "qen").

Metakarakteri "*" lexohet si "çdo shumë nga zero ose më shumë", d.m.th. dizajni

përcakton çdo numër shkronjash të njëpasnjëshme, duke përfshirë mungesën e plotë të tyre.

Simboli "+" ndryshon nga një yll vetëm në atë që kërkon praninë e të paktën një karakteri. Ato. dizajni

përputhet çdo sekuencë dixhitale me një ose më shumë shifra.

Simboli "?" përputhet me mungesën ose praninë e një karakteri të vetëm. Ato. dizajni

përputhet çdo sekuencë dixhitale me një ose dy shifra.

Këtu vlen të përmendet një veçori e tillë e antiifikuesve "*" dhe "+" si lakmia. Çështja është se si parazgjedhje këto karaktere korrespondojnë me sekuencën më të gjatë të mundshme të karaktereve. Për shembull, për rreshtin "mami lau kornizën" shprehja:

do të zgjedhë “mama soap ra”, që është disi e papritur, sepse prisnim të merrnim “ma”. Për të ndryshuar këtë sjellje, përdorni metakarakterin "?" (pikëpyetje) e shkruar menjëherë pas kuantifikuesit. Kufizon "oreksin" e matësit duke i detyruar ata të kthejnë ndeshjen e parë dhe jo ndeshjen më të gjatë. Tani le të ndryshojmë shembullin e mëparshëm:

dhe merrni ndeshjen e kërkuar "ma".

Elementi i fundit i gjuhës është modifikuesit. Një modifikues është një karakter i veçantë që përcakton parametrat e "sistemit" për analizimin e shprehjeve të rregullta. Ekzistojnë vetëm katër simbole të tilla, ato mund të përdoren individualisht ose njëkohësisht:

i Aktivizon modalitetin e pandjeshëm ndaj shkronjave, d.m.th. shkronjat e mëdha dhe të vogla nuk ndryshojnë në shprehje.
m Tregon që teksti që kërkohet duhet të trajtohet si i përbërë nga rreshta të shumtë. Si parazgjedhje, motori i shprehjeve të rregullta e trajton tekstin si një varg të vetëm, pavarësisht se çfarë është në të vërtetë. Prandaj, metakarakteret "^" dhe "$" tregojnë 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 karakterin e linjës së re në përkufizimin e tij. Ato. Për tekst me shumë rreshta shprehja /.+/ do të kthejë vetëm rreshtin e parë, jo të gjithë tekstin siç pritej. Specifikimi i këtij modifikuesi e heq këtë kufizim.
U Si parazgjedhje i bën të gjithë metakarakterët sasiorë "jo të pangopur". Në disa modifikime të gjuhës (veçanërisht në PHP), në vend të "U", përdoret karakteri "g", i cili përputhet më shumë me kuptimin ("g" është shkurtim për anglishten "greedy", "greedy" ).

Tabela tregon më të njohurat dhe shembuj të nevojshëm shprehjet e rregullta. Disa prej tyre mund t'ju duken të ndërlikuara dhe të rënda, por me një studim të hollësishëm padyshim që do t'i kuptoni.

Shprehjet e rregullta në PHP.

Për të punuar me shprehje të rregullta në PHP, ekzistojnë funksione të veçanta, lista e të cilave Përshkrim i shkurtër janë dhënë në tabelë:

int preg_match (modeli i vargut, subjekti i vargut [, përputhjet e vargjeve])

Funksioni kontrollon nëse përmbajtja e subjektit përputhet me modelin e modelit. Kthen 1 nëse gjenden ndeshje, përndryshe kthen 0. Nëse nuk specifikohet parametri i kërkuar-përputhet me grupin, atëherë kur funksioni të ekzekutohet, një element i vetëm do të futet në të - përputhja e parë e gjetur.

"; print_r($found); ?>

int preg_match_all (modeli i vargut, subjekti i vargut, përputhet vargu [, rendi int])
Funksioni është identik me atë të mëparshëm, me të vetmin ndryshim - ai kërkon të gjithë tekstin dhe kthen TË GJITHA ndeshjet e gjetura në grupin e ndeshjeve.
i përzier preg_replace (model i përzier, zëvendësim i përzier, subjekt i përzier [, kufiri i përfshirë])
Ashtu si të dy funksionet paraardhëse të tij, preg_replace kërkon për një pjesë teksti që përputhet me një model. Funksioni zëvendëson të gjitha fragmentet e gjetura me tekstin e specifikuar në parametrat.Para pastrimit:\n$text\n\n"; $text = preg_replace("/(\n \s(2,))/"," ",$text); jehonë " Pas pastrimit:\n$text"; // do të shfaqë tekstin e pastruar nga karaktere të veçanta // dhe hapësira shtesë?>
i përzier preg_replace_callback (model i përzier, kthim i përzier, subjekt i përzier [, kufiri int])
Funksioni është një version i zgjeruar i atij të mëparshmi. Dallimi kryesor është se këtij funksioni i kalohet në parametrat emri i funksionit që do të analizojë tekstin dhe do të gjenerojë tekst zëvendësues.
grupi preg_split (modeli i vargut, subjekti i vargut [, kufiri int [, flamujt int]])
Ky funksion është i ngjashëm me funksionet explode() dhe split(). E veçanta e tij është se ndarësi nuk është një varg fiks, por një shprehje e rregullt. Funksioni ndan të dhënat burimore në elementë dhe i vendos ato në grupin e daljes.
vargu preg_grep (modeli i vargut, futja e vargut)
Funksioni është krijuar për kërkim të rregullt në vargje. Për kërkimin, specifikohet një shabllon dhe një grup të dhënash hyrëse dhe kthehet një grup i përbërë vetëm nga elementë që përputhen me shabllonin.

Lista e funksioneve të shqyrtuara nuk është aspak e plotë, por është mjaft e mjaftueshme për një fillim të suksesshëm të punës me shprehje të rregullta. Nëse jeni të interesuar për këtë temë, sigurohuni që të lexoni Leximi më tej(për shembull, libri i Friedl "Shprehjet e rregullta"). Përveç kësaj, për qëllime trajnimi, unë rekomandoj instalimin e një prej programe speciale për testimin e shprehjeve të rregullta (për shembull, "PCRE" ose "RegEx Builder").

Le të fillojmë me atë që është një shprehje e rregullt. Pra, përgjigjuni kësaj pyetjeje: a ka një "e" në fjalën "test"? "Hani!" ti thua. Pastaj ju bëj një pyetje të dytë, si e gjetët shkronjën "e" në fjalën "test"? Përgjigja është e qartë, marrim karakterin e parë, domethënë "t" dhe e krahasojmë me atë që kërkojmë, domethënë me "e". Nëse nuk janë të barabartë, atëherë marrim karakterin e dytë, domethënë "e" dhe e krahasojmë me atë që kërkojmë, domethënë "e". Voila! U gjet një ndeshje. Përgjigje: Fjala "test" përmban shkronjën "e".

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 është, shkronja "e" në në këtë shembull dhe ka një shprehje të rregullt.

Për çfarë përdoren shprehjet e rregullta në PHP? Në praktikën time, shprehjet e rregullta u përdorën, për shembull, për të përcaktuar nëse një adresë emaili ishte kompozuar saktë. Shprehje të tilla përdoren gjithashtu 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ë një lidhje dhe ta ruani atë. Ka shumë gjëra që mund të bëni Duke analizuar këtë, ju mund të identifikoni funksionin kryesor të shprehjeve të rregullta, dhe dy ato anësore. Funksioni kryesor , ky është një kërkim për ndeshjet në një varg. Efektet anësore përfshijnë ruajtjen e ndeshjeve të gjetura dhe zëvendësimin e tyre.

Shprehja e parë e rregullt

Teorikisht kuptojmë se si të gjejmë karakterin "e" në fjalën "test", por 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", "Ndryshore në të cilën ruhet rezultati i kërkimit (parametër opsional)"); - Funksioni i përputhjes
preg_replace("shprehje e rregullt (modeli)", "Me çfarë të zëvendësohet përputhja e gjetur", "ndryshore në të cilën është bërë zëvendësimi"); - 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 kushtin: nëse diçka që përputhet me modelin gjendet në variablin $a, atëherë shfaqni mesazhin "found!!" Siç mund ta keni vënë re, shablloni ynë ndodhet midis dy "/". Në këtë rast, simboli "/" simbolizon fillimin dhe fundin e modelit tonë. Shpresoj se kjo është e qartë.

E gjithë kjo është interesante, sigurisht... por modeli ynë është shumë i thjeshtë, a nuk mendoni? Në fund të fundit, ne rrallë kemi nevojë të gjejmë ndonjë simbol 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, kështu që si mund ta identifikoni atë? Ju vetë iu përgjigjët pyetjes suaj, ka ndonjë shkronjë, domethënë është në rangun nga a në z. Ju mund të përdorni vargjet 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ërcaktohet si një simbol, në këtë rast simboli varion nga a në z. Nëse nuk duhet të gjejmë 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ë karakteret "A" dhe "a" janë krejtësisht të ndryshme, për të kërkuar të dy karakteret, shkruani kështu:

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

Ekziston edhe një kërkim për shkronjat ruse, të kryera në të njëjtën mënyrë si me ato angleze:

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

Metakarakteret

Mësuam 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 metasimbole vijnë në shpëtim... Supozoni se kemi një varg me numra dhe shkronja, si mund ta përshkruajmë atë në shabllon? Ti mund ta besh kete:

linjë - 123a321
mostër -

Hmm... shablloni në fakt përputhet me vargun tonë dhe kur kontrollohet për pajtueshmëri, ai do të japë të vërtetën e shumëpritur! Por është një rekord i rëndë, a nuk mendoni?

Ja si ta shkurtoni atë:

linjë - 123a321
mostër - *

Më duket se është më i shkurtër. Cili është simboli "*"? Ky është i njëjti metasimbol, do të thotë që simboli që përshkruam (domethënë, një simbol 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, ose më shumë se një herë. Po Po! Ky metasimbol do të gjejë një përputhje në një variabël bosh, pasi edhe mungesa e simbolit që përshkruam do të kthehet e vërtetë! Mbaje mend këte

Çfarë metakarakterash të tjerë ka?

Për shembull, metakarakteri "+" Është pothuajse i ngjashëm 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ë praninë e të paktën një karakteri. Kjo do të thotë, nëse një linjë kërkon praninë minimale një karakter pastaj përdorni "+" në vend të "*"

Përdoret shpesh edhe metakarakteri "?". Do të thotë që rreshti nuk duhet të përmbajë më shumë se një karakter të dëshiruar. Më lejoni të 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 kemi lejuar? Shkronjat anglezeçdo regjistër dhe numra. Tani provoni 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ë parë nëse kishte të paktën një karakter.

Dhe tani një truk i vogël, le t'i hedhim një sy shprehjes sonë, nuk e lejuam, mirë, le të themi një hapësirë ​​në të, 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ë për fjalëkalimin e saktë? Është mjaft e thjeshtë... Funksioni preg_match(); ndalon kontrollin e tij në ndeshjen e parë. Kjo do të thotë, simboli "q" i përshtatet modelit që përshkruam, dhe gjithçka tjetër nuk është më e rëndësishme për funksionin. Ja se si ta rregulloni atë:

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

Duke shtuar një "^" në fillim të një shprehjeje dhe një "$" në fund, ne i tregojmë funksionit se çfarë duhet të përputhet modeli. të gjitha linjë. Nëse përdorni këtë kod, nuk do ta shihni mesazhin, pasi ka një karakter të paligjshë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 se kam shpjeguar siç duhet punën e këtyre tre metakarakterëve të përdorur shpesh

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

Të paktën kemi mësuar të kontrollojmë se fjalëkalimi është i saktë, 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ë një varg. Si ta bëjmë atë? Këtu është linja:

(Kam futur në mënyrë specifike këto simbole "-_+()" në të në mënyrë që jeta të mos duket si mjaltë ...) Mund të formulojmë shprehjen e mëposhtme:

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

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

Si e arritëm këtë? Ne futëm simbolin Por! kapaku "^" ([^0-9]) i vendosur në fillim tregon se do të ketë nuk duhet Shpresoj që kjo të jetë zgjidhur

Epo, le ta përfundojmë ngadalë ... Unë do të jap dy shembuj me shpjegime, gjatë të cilave do të mësojmë se si ta ruajmë rezultatin e kërkimit në një variabël dhe të mësojmë se si të kontrollojmë adresën postare për korrektësi

E pashë dhe e ruajta!

Blogu im

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

Në shprehjen tonë të rregullt kemi përshkruar të gjitha karakteret e mundshme që mund të përfshihen në një lidhje. Dua t'i kushtoj vëmendje edhe citatit dhe karaktereve "/" në shprehjen tonë. Ata paraprihen nga një vijë e prapme, për çfarë është ajo? Fakti është se "/" dhe citati janë vetë karaktere të veçanta. Dhe në mënyrë që shablloni t'i perceptojë ato si simbole të zakonshme, ne duhet t'i kontrollojmë ato. Arratisja 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 ndryshores $b, në të cilën do të ruhet lidhja e gjetur. Ju gjithashtu duhet të dini se rezultati i kërkimit është vendosur në një grup. Prandaj, ndryshorja $b është një grup. Informacioni që ne kërkojmë është nën indeksin 1. Kjo do të thotë se rezultati i kërkimit është në variablin $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ë zbuloni se cilat karaktere lejohen në adresa? Me sa di unë, personazhet e lejuar përfshijnë:

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

Pra, shprehja e rregullt do të jetë si më poshtë:

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

Epo... Shpresoj që regjistrime të tilla të mos ju frikësojnë tani dhe mund t'i kuptoni fare.

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, për të cilën ju faleminderit shumë

Lidhur me serinë e artikujve për zhvillimin e një blogu cms, pjesa e parë e serisë E deklaroj të mbyllur! Në të ardhmen e afërt do të fillojmë të zbatojmë panelin e administratorit, kështu që mos "ndërroni" Nëse keni ndonjë pyetje, unë do të jem i lumtur t'ju përgjigjem. Të gjitha të mirat për ju, vetëm kaq kam!

Kur punoni me tekste në ndonjë gjuha moderne programimi, zhvilluesit përballen vazhdimisht me detyrën e kontrollit të të dhënave të futura për pajtueshmëri shabllonin e kërkuar, kërkimi dhe zëvendësimi i fragmenteve të provës 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 gjuhëve të zhvillimit të internetit dhe WEB-it kërkonte krijimin e mjeteve universale dhe kompakte të përpunimit informacion teksti me sasinë 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ë reduktoni kodin e programit me dhjetëra e qindra rreshta. Shumë probleme nuk mund të zgjidhen 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 shprehjeve të rregullta PCRE, e zhvilluar fillimisht për gjuhën Perl, e cila përfshihet me PHP. Funksionet Preg kërkojnë një varg teksti të caktuar për përputhje sipas një modeli specifik në gjuhën e shprehjes së rregullt.

Bazat e sintaksës

Në një artikull të shkurtër është e pamundur të përshkruhet në detaje e gjithë sintaksa e shprehjeve të rregullta, ekziston literaturë e veçantë për këtë. Ne paraqesim 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 në një mënyrë shumë komplekse, kështu që le të thjeshtojmë përshkrimin. Një shprehje 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. Përfshirja e mundshme në shabllone alternativa të ndryshme dhe përsëritjet.

Për shembull, në shprehje /\d(3)-\d(2)-\d(2)/m ndarësi do të jetë «/» , pastaj vjen modeli dhe simboli "m" do të jetë një modifikues.

E gjithë fuqia e shprehjeve të rregullta është e koduar duke përdorur metakaraktere. Metakarakteri kryesor i gjuhës është vija e prapme - "\". Ai ndryshon llojin e personazhit që e ndjek atë (d.m.th. simbol i rregullt shndërrohet në metakarakter dhe anasjelltas). Një tjetër metakarakter i rëndësishëm është prerja përpara "|", e cila specifikon opsionet alternative shabllon. Më shumë shembuj të metakaraktereve:

PHP, kur përpunon shprehjet e rregullta, e trajton hapësirën 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 ndahen me kllapa dhe nganjëherë quhen "nënshprehje". Kryeni funksionet e mëposhtme:

    Theksimi i alternativave. Për shembull, shabllon nxehtësi(diçka|zog|) përputhet me fjalët "nxehtësia", "zogu i zjarrit" Dhe "i pjekur". Dhe pa kllapa do të jetë vetëm vijë bosh, "pule" dhe "pjekje".

    Nën-model "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ë japim një shembull. Duke pasur parasysh shprehjen e rregullt të mëposhtme: fituesi merr ((artë|i praruar) (medalja|kupa)) - dhe një rresht për të gjetur ndeshjet: "Fituesi merr një medalje të artë". Përveç frazës origjinale, rezultati i kërkimit do të kthehet: "medalje të artë", "medalja", "ari".

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

Kur shkruani shprehje të rregullta, shpesh është e nevojshme të analizohen përsëritjet e numrave dhe simboleve. 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ërdorni metakarakter të veçantë.

Për të përshkruar përsëritjet, përdoren kuadrifikuesit - metasimbolet për të specifikuar sasinë. Kuadrifikuesit 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ë një elementi, të shprehur si dy numra në kllapa kaçurrelë, si kjo: x(2,5). Nëse numri maksimal i përsëritjeve është i panjohur, argumenti i dytë hiqet: x(2,).

Kuantifikuesit e shkurtra përfaqësojnë simbole për përsëritjet më të zakonshme për të shmangur rrëmujën e panevojshme sintaksore. 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ë mësojnë shprehje të rregullta, shembujt janë mësimi më i mirë. Ne do të paraqesim disa që tregojnë aftësitë e tyre të gjera me një përpjekje minimale. Të gjitha kodet e programit plotësisht në përputhje me Versionet PHP 4.x dhe më lart. Për mirëkuptim të plotë sintaksë dhe përdorimin e të gjitha veçorive gjuhësore, ne rekomandojmë librin e J. Friedl “Regular Expressions”, i cili diskuton plotësisht sintaksën dhe përmban shembuj të shprehjeve të rregullta jo vetëm në PHP, por edhe për Gjuhët 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ërgoni mesazhe. Verifikimi nuk garanton që të specifikuara Kuti postare realisht ekziston dhe pranon letra. Por padyshim që e hiqni atë adresa të gabuara ajo mundet.

Zgjidhje. Si në çdo gjuhë programimi, shprehjet e rregullta për verifikimin e adresës së emailit mund të zbatohen në PHP menyra te ndryshme, dhe shembujt në këtë artikull nuk janë 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 tërësisht nga zhvilluesi.

Pra, një shprehje që kontrollon nëse një email është i vlefshëm duhet të kontrollojë kushtet e mëposhtme:

  1. Disponueshmëria në linjë origjinale simbol @ dhe pa hapësira.
  2. Pjesa e domenit të adresës, e ndjekur nga simboli @, 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 kontrolloni një emër përdoruesi, duhet të kërkoni për karaktere të veçanta si apostrofi ose Këto karaktere janë potencialisht të rrezikshëm dhe mund të gjenden në sulme të tilla si injeksioni SQL. Shmangni adresa të tilla.
  4. Emrat e përdoruesve lejojnë vetëm një pikë, e cila nuk mund të jetë karakteri i parë apo i fundit në rresht.
  5. Emri i domenit duhet të përmbajë të paktën dy dhe jo më shumë se gjashtë karaktere.

Një shembull që merr parasysh gjithçka kushtet e specifikuara, mund të shihet më tej në figurë.

Kontrollimi i vlefshmërisë së URL-ve

Detyrë. Kontrolloni nëse një varg teksti i dhënë është i vlefshëm Edhe një herë, shprehjet e rregullta të kontrollit të 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ë shohim 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ë kontrolloni saktësinë e numrit të futur kartë plastike sistemet më të zakonshme të pagesave. Opsioni konsiderohet vetëm për kartat

Zgjidhje. Kur krijoni një shprehje, duhet të merrni parasysh praninë e mundshme të hapësirave në numrin e futur. Numrat në kartë ndahen në grupe për ta bërë më të lehtë leximin dhe diktimin. Prandaj, është krejt e natyrshme që një person mund të përpiqet të fusë numrin në këtë mënyrë (d.m.th. duke përdorur hapësira).

Shkruani një shprehje universale që merr parasysh boshllëqe të mundshme dhe vizat, ë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ç numrave.

Tani mund të vazhdoni drejtpërdrejt me kontrollimin e numrit. Të gjitha kompanitë që prodhojnë kartat e kreditit, përdorni një format unik të numrave. Shembulli e përdor këtë, dhe klienti nuk ka nevojë të fusë emrin e kompanisë - përcaktohet nga numri. kartat e vizave gjithmonë filloni me 4 dhe keni një gjatësi prej 13 ose 16 shifrash. MasterCard fillon në rangun 51-55 me një gjatësi prej 16. Si rezultat, marrim shprehjen e mëposhtme:

Përpara se të përpunoni porosinë tuaj, mundeni kontroll shtesë shifra e fundit e 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ë telefonat fiks dhe celular numrat e telefonit ndryshon ndjeshëm nga vendi në vend, kështu që nuk është e mundur të kontrollohet universalisht nëse një numër telefoni është i saktë duke përdorur shprehje të rregullta. Por numra ndërkombëtarë kanë një format të rreptë dhe janë të shkëlqyera për t'u kontrolluar me një shabllon. Për më tepër, gjithnjë e më shumë kombëtare operatorët telefonikë duke u përpjekur të përshtatesh standard i unifikuar. Struktura e numrit është si më poshtë:

+CCC.NNNNNNNNNNxEEEE, Ku:

C është kodi i shtetit, i përbërë nga 1-3 shifra.

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

E - zgjatje opsionale.

Plus është element i detyrueshëm, dhe shenja x është e pranishme vetëm kur zgjerimi është i nevojshëm.

Si rezultat, kemi shprehjen e mëposhtme:

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

Numrat në varg

Detyrë. Ju duhet të përputheni me një numër të plotë brenda një diapazoni specifik. Për më tepër, është e nevojshme që shprehjet e rregullta të përputhen vetëm me numra nga një varg vlerash.

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

Gjetja e një adrese 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. Si në çdo detyrë në Gjuha PHP, shprehja e rregullt ka shumë ndryshime. Për shembull, kjo:

Kontrollimi i shprehjeve në internet

Testimi i saktësisë së shprehjeve të rregullta mund të jetë i vështirë për programuesit e rinj 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 shprehjen dhe të dhënat që do të testohen dhe shikon menjëherë rezultatin e përpunimit. Zakonisht ekziston edhe një seksion referimi ku shprehjet e rregullta, shembujt dhe ndryshimet e zbatimit për gjuhët më të zakonshme të programimit përshkruhen në detaje.

Por besimi plotësisht i rezultateve të 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ë tuaja dhe garanton mungesën e gabimeve.

Përdorimi më i zakonshëm i shprehjeve të rregullta në Perl është në kërkimin dhe zëvendësimin e operatorëve si p.sh s//, m/, operatorët lidhës =~ ose != etj. Si rregull, të gjithë këta operatorë kanë opsione të ngjashme si:

Zakonisht të gjitha këto opsione shënohen si "/x". Ato madje mund të përdoren brenda shablloneve duke përdorur konstruksionin e ri (?...)

Shprehjet ose modelet e rregullta janë të njëjta me procedurat regexp në Unix. Shprehjet dhe sintaksa janë huazuar nga procedurat V8 të shpërndara lirisht nga Henry Spencer, ku ato përshkruhen në detaje.

Modelet përdorin metakarakterët e mëposhtëm (karaktere që tregojnë grupe personazhesh të tjerë) që shpesh quhen standardi egrep:

Metakarakterët kanë modifikues (të shkruar pas metakarakterit):

Në të gjitha rastet e tjera, mbajtëset kaçurrela konsiderohen karaktere të zakonshme (të rregullta). Kështu "*" është ekuivalente me (0,), "+" është (1,) dhe "?" - (0.1). n dhe m nuk mund të jenë më të mëdha se 65536.

Si parazgjedhje, metakarakterët janë të pangopur. Ndeshja përhapet sa më shumë që të jetë e mundur, pa marrë parasysh efektin e metakaraktereve të mëvonshëm. Nëse dëshironi të "zvogëloni oreksin e tyre", atëherë përdorni simbolin "?". Kjo nuk e ndryshon kuptimin e metakaraktereve, thjesht zvogëlon përhapjen. Kështu:

Shkronjat e egra funksionojnë në të njëjtën mënyrë si thonjëzat e dyfishta, kështu që mund të përdorni karaktere `\` - (karaktere me vijë të kundërt) në to:

\t - karakteri i skedës
\n - linjë e re
\r - një kthim me karrocë
\A - përkthimi në format
\v - tabela vertikale
\a - thirrni
\e - arratisje
\033 - shënimi i simbolit oktal
\x1A - heksadecimal
\c[ - simboli i kontrollit
\l - karakteri tjetër me shkronja të vogla
\u - me shkronja kapitale -//-
\L - të gjithë personazhet në shkronja të vogla te \E
\U - në pjesën e sipërme -//-
\E - regjistri kufizues i ndryshimit
\Q - anuloni veprimin si metakarakter

Për më tepër, metakarakterët e mëposhtëm janë shtuar në Perl:

Vini re se ky është i gjithi "një" karakter. Përdorni modifikues për të treguar sekuencën. Kështu që:

Përveç kësaj, ka metakaraktere imagjinare. Duke treguar simbole joekzistente në vendin ku ndryshon vlera. Të tilla si:

Kufiri i fjalës (\b) është një pikë imagjinare midis karaktereve \w dhe \W. Brenda një klase karakteresh, "\b" përfaqëson karakterin backspace. Metakarakteret \A Dhe \Z- janë të ngjashme me "^" dhe "$", por nëse fillimi i rreshtit "^" dhe fundi i rreshtit "$" veprojnë për secilën rresht në një varg me shumë rreshta, atëherë \A Dhe \Z tregoni fillimin dhe fundin e një vargu të tërë me shumë rreshta.

Nëse grupimi (kllapat) përdoret brenda modelit, atëherë numri i nënvargut të grupit përcaktohet si "\shifror". Vini re se duke ndjekur modelin brenda një shprehjeje ose blloku, këto grupe shënohen si "$shifror". Përveç kësaj, ka variabla shtesë:

Shembull:

$s = "Një 1 dy 2 dhe tre 3"; if ($s =~ /(\d+)\D+(\d+)/) ( print "$1\n"; # Rezultati "1" print "$2\n"; # "2" print "$+\n" ; # "2" print "$&\n" # "1 dy 2" print "$"\n";

Versioni 5 i Perl përmban konstruksione shtesë të shabllonit:

Shembull:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Gjeni numrin e ndjekur nga "-" ( print "$1\n"; # Rezultati "2" ) other ( print "gabim kërkimi\n" ;)

(?! model) - "duke parë" përpara me anë të mohimit:

Shembull:

$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Gjeni një shifër që nuk ndiqet nga "+" ( print "$1\n"; # Rezultati "2" ) else ( print "kërko gabim\ n";)

(?ismx) - modifikues "të brendshëm". Është i përshtatshëm për t'u përdorur në shabllone, ku, për shembull, duhet të specifikoni një modifikues brenda shabllonit.

Rregullat e shprehjes së rregullt. (regex)

  1. Çdo personazh përfaqëson veten, përveç nëse është një metakarakter. Nëse duhet të anuloni efektin e një metakarakteri, vendosni "\" përpara tij.
  2. Vargu i karaktereve tregon një varg të këtyre karaktereve.
  3. Një tufë me personazhet e mundshëm(klasa) është mbyllur në kllapa katrore "", kjo do të thotë se në ky vend mund të jetë një nga personazhet e treguar në kllapa. Nëse karakteri i parë në kllapa është "^", atëherë asnjë nga karakteret e specifikuara nuk mund të shfaqet në këtë pikë të shprehjes. Brenda një klase, ju mund të përdorni simbolin "-" për të treguar një sërë karakteresh. Për shembull, a-z është një nga shkronjat e vogla Alfabeti latin, 0-9 - numri, etj.
  4. Forumi i portalit PHP. S.U.

Shprehjet e rregullta janë modele të veçanta për kërkimin e nënvargjeve në tekst. Me ndihmën e tyre, ju mund të zgjidhni problemet e mëposhtme në një rresht: "kontrolloni nëse një varg përmban numra", "gjeni të gjitha adresat e emailit", "zëvendëso disa pikëpyetje të njëpasnjëshme me një."

Le të fillojmë me disa mençuri të njohura të programimit:

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

Shembuj shabllonesh

Le të fillojmë me një çift 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 Letër ruse dhe e treta është një "t" e pandjeshme ndaj shkronjave (p.sh. "cat" ose "CAT" i përshtatet këtij modeli). Shprehja e dytë kërkon kohën në tekst në formatin 12:34.

Çdo shprehje fillon me një karakter ndarës. Simboli / zakonisht përdoret si ai, por mund të përdorni edhe simbole të tjera që nuk kanë një qëllim të veçantë në shprehjet e rregullta, për shembull, ~, # ose @. Kufizuesit alternativë përdoren nëse karakteri / mund të shfaqet në shprehje. Pastaj shkon vetë modeli i linjës, që po kërkojmë, e ndjekur nga një kufitar i dytë dhe në fund mund të ketë një ose më shumë shkronja flamuri. Ata pyesin opsione shtesë kur kërkoni për 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 kodimin utf-8, dhe jo vetëm letra. 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ë zakonshme dhe ndërtime 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 listën e plotë karaktere speciale (në manualin PHP quhen metakarakter), dhe të gjithë personazhet e tjerë në sekuencën 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 "e" vendoset veçmas në shprehjen e parë), por tani për tani le të përpiqemi të zbatojmë shprehjet tona të rregullta në tekst dhe të shohim se çfarë ndodh. Ka në php funksion të veçantë preg_match($regexp, $text, $match) , i cili merr si hyrje shprehje të rregullt, tekst dhe një grup bosh. Kontrollon nëse teksti përmban një nënvarg që përputhet këtë shabllon dhe kthen 0 nëse jo, ose 1 nëse ka. Dhe në grupin e kaluar, përputhja e parë e gjetur me sekuencën e rregullt vendoset në elementin me indeks 0. Le të shkruajmë një program të thjeshtë që aplikon shprehje të rregullta në vargje të ndryshme:

Pasi të shohim shembullin, le të studiojmë shprehjet e rregullta në më shumë detaje.

Kllapa në shprehje të rregullta

Le të përsërisim se çfarë nënkuptojnë tipe te ndryshme kllapa:

  • 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ë "një nga këto karaktere", në këtë rast shkronjat a, b, c, x, y, z ose një numër nga 0 në 5. Karaktere të tjera speciale si | ose * - ato tregojnë një karakter të rregullt. Nëse në kllapa katrore në fillim ka një simbol ^, pastaj kuptimi ndryshon në të kundërtën: "çdo karakter përveç atyre të treguara" - për shembull [^a-c] do të thotë "çdo karakter përveç a, b ose c".
  • Kllapa të rrumbullakëta simbolet dhe shprehjet e grupit. 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ë sasia plus i referohet sekuencës bc dhe shprehja kërkon fjalët abc, abcbc, abcbcbc

Shënim: mund të specifikoni vargjet e karaktereve 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 [a-яе].

Bexslashes

Nëse keni shikuar mësime të tjera për shprehjet e rregullta, me siguri 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ë vijë të prapme. Megjithatë, në rreshta në të vetme dhe thonjëza të dyfishta 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 trajtojë këtë si një kombinim të veçantë dhe do të fusë vetëm karakterin $ në varg (dhe motori i shprehjes së rregullt 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 sekuenca e karaktereve ka një 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ë kod
  • 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ë format të rregullt, duhet të dyfishoni vijën e prapme: "\\1"

Në raste të tjera, një ose dy vija të prapme do të japin të njëjtin rezultat: "\\d" dhe "\d" do të fusin një palë karakteresh \d në rresht - në rastin e parë, 2 kthesa të pasme janë sekuenca për futjen e një vije të prapme. , në rastin e dytë nuk ka sekuencë të veçantë dhe personazhet do të futen siç janë. Ju mund të kontrolloni se cilat karaktere do të futen në një 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?

Modele speciale në sezonin e rregullt

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

Gjithashtu, ekziston një kusht i përshtatshëm për të treguar një kufi fjalësh: \b . Ky konstruksion do të thotë që në njërën anë të tij duhet të ketë një karakter që është shkronjë/numër/nënvizim (\w), dhe në anën tjetër duhet të ketë një karakter që nuk është. 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 "bagëti". Është e qartë se kjo nuk është ajo që ne donim. Nëse i shtojmë një kusht kufirit të fjalës shprehjes së rregullt: /\bcat\b/ui , atëherë tani do të kërkohet vetëm fjala e pavarur "cat".

Manual

  • Sintaksa e shprehjes së rregullt në PHP, përshkrim i detajuar

Artikujt më të mirë mbi këtë temë