Shprehje të rregullta zëvendësim i karaktereve php. Shprehje të rregullta në php

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

Për çfarë përdoren shprehjet e rregullta në PHP? Në praktikën time, shprehje të 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

Në teori, ne 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", "Ndryshorja 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 bëhet 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 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ë karakteret "A" dhe "a" janë krejtësisht të ndryshme, për të kërkuar për 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ë të vërtetë 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 lejojmë? Shkronjat angleze të çdo rasti dhe numrash. 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 e 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 të 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ë dini 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, kjo është e gjitha nga unë!


Një nga veçoritë shumë të fuqishme dhe të dobishme të gjuhës PHP është mbështetja e saj 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.


Shprehjet e rregullta 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 vazhdimisht situata kur keni tekst (për shembull, në Microsoft Word) dhe 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 përballeni me detyrën për të gjetur të gjitha adresat e emailit në një dokument prej disa qindra fletësh. Disa do ta shikojnë dokumentin manualisht, 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.

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

Në këtë rast, simbolet nënkuptojnë çdo simbol të ç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 karakteresh është disa karaktere të shkruara në mënyrë sekuenciale:

ACZms abvg

Do të doja të tërhiqja menjëherë vëmendjen - "hapësira" në shprehjet e rregullta konsiderohet gjithashtu si një karakter domethënës, prandaj 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:

Metakaraktere për specifikimin e karaktereve speciale
() Kllapa. Përcakton 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 përcaktimin e grupeve të personazheve
. Pika. Çdo personazh.
\d Shifra (0-9)
\D Jo një numër (çdo karakter 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" - shifra (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 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ë numri maksimal i përsëritjeve. 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 me 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 të paktën një karakter. 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 atë 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 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 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 tekstin 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 i anglishtes "greedy", "greedy" ).

Tabela tregon shembujt më të njohur dhe të nevojshëm të shprehjeve të 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.

Ekzistojnë funksione të veçanta për të punuar me shprehje të rregullta në PHP, një listë e të cilave dhe një përshkrim i shkurtër jepet 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 përputhje, përndryshe kthen 0. Nëse specifikoni parametrin opsional të grupit të përputhjeve, 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 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 i thirrjeve, 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 [, limiti 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 literaturë shtesë (për shembull, libri i Friedl "Shprehjet e rregullta"). Për më tepër, për qëllime trajnimi, unë rekomandoj instalimin e një prej programeve speciale për testimin e shprehjeve të rregullta (për shembull, "PCRE" ose "RegEx Builder").

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. Duke përdorur këtë shabllon, mund të kërkoni për dukuritë, të bëni zëvendësime dhe të kontrolloni përputhshmërinë me shabllonin.

Rregullat për krijimin e një modeli

Kufijtë e shabllonit duhet të tregohen me simbole të caktuara, shpesh duke përdorur " / ", por unë preferoj të përdor" # "Sepse bollëku i vijave përpara/prapa mund t'ju verbojë sytë, dhe shenjat e hash zakonisht nuk përdoren askund tjetër. Pra: " #HereBodyShprehje e rregullt#"

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

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

Kjo shprehje është krijuar për të marrë parametrat 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, ky është vetëm tekst që duhet të përmbahet në rresht. Më pas kemi hasur në kllapa, d.m.th. kemi arritur në nënshprehjen e parë. Kllapat katrore tregojnë shumë karaktere që mund të jenë në rresht në këtë vend. Shenja " - "do të thotë numërim. Shenjë" \ " i shpëton karaktereve speciale. Kështu, në nënshprehjen e parë mund të kemi KAPITALE dhe shkronja 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 simbole pas kllapave katrore ka një shenjë ". + " - kjo do të thotë se karakteri i mëparshëm (dhe për ne ky është një grup karakteresh të specifikuara në kllapa katrore) mund të shfaqet 1 ose më shumë herë. Pastaj vjen " / "është vetëm një simbol, dhe një nënshprehje e dytë e ngjashme. Pastaj vjen " \.html"çfarë do të thotë teksti" .html". Dhe pastaj personazhe speciale" .* "Një pikë do të thotë çdo karakter, dhe një yll do të thotë çdo sasi e karakterit të mëparshëm. Kjo është, pas " .html“Çdo gjë mund të shkojë.

Tregimi i sasisë, kuantifikuesit

Më sipër 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"

Le të shohim konceptin e lakmisë së shprehjes së rregullt. Për shembull, ekziston një rresht:

#()#

Lexojmë: nënshprehje:

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

Por përshtatet gjithashtu:

Kjo është ajo që ne do të marrim, sepse ... Shprehjet e rregullta janë lakmitare si parazgjedhje. Ju mund të hiqni lakminë duke përdorur modifikuesin " U", si kjo:

#()#U

Modifikuesit

Një shprehje e rregullt mund të ndiqet nga modifikues: " #HereBodyRegularExpression#HereModifiers"Llojet e modifikuesve:

i Aktivizon modalitetin e pandjeshëm ndaj shkronjave, 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 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 "$" tregoni fillimin dhe fundin e të gjithë tekstit. Nëse specifikohet ky modifikues, 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 shprehjes së rregullt
u Mundëson punën me shprehjet e rregullta 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ërkoni dhe zëvendësoni:

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 duke përdorur një shprehje të rregullt:

Preg_split (vargu $pattern , vargu $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ë korrespondojnë me modelin model.

) Ju tregova një shembull të përdorimit të shprehjeve të rregullta për të gjetur pjesë specifike 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 nevojshme në vëllime të mëdha teksti, etj.

Kjo temë është mjaft e ndërlikuar, por unë do të përpiqem të trajtoj shkurtimisht pikat më të rëndësishme. Nuk e di sa i suksesshëm do të jem, por shpresoj që mësimi 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 një shprehje të rregullt;
  • preg_match - vetëm një kërkim i rregullt;
  • preg_split - kërkoni dhe ndani tekstin.

Të paktën, në mësimet e mëparshme i kemi përdorur ato. Më saktë, në vend të preg_match kishte preg_match_all, por në thelb kjo është 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, 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ë karakter i 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=checkbox, si dhe etiketat hapëse dhe mbyllëse. I kanë zëvendësuar me “, pra thjesht i kanë fshirë. Shpresoj se gjithçka është e qartë këtu. Ne do të kalojmë në analizimin e vetë shprehjes (parametri i parë i funksionit) pak më vonë.
Kishte gjithashtu një shembull të përdorimit të 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ë po analizonim. Ja çfarë ndodhi:

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

Parametri i parë është përsëri një shprehje e rregullt për të gjetur të gjitha lidhjet që janë mbyllur natyrshëm në etiketën "a" (nëse nuk jeni të njohur me shënimin html, atëherë lexoni). 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, gjithçka që mbetet është të kalojmë të gjithë elementët e nevojshëm të $ok për të marrë kapjet kryesore që na duhen. Më vete, duhet thënë se në dalje marrim një grup shumëdimensional. Kjo është arsyeja pse ne e shfaqëm atë në një mënyrë kaq komplekse: $ok[$j]. Për të parë strukturën e grupit, përdorni funksionin më poshtë dhe do të kuptoni gjithçka.

Print_r($ok);

Duket se i kemi renditur funksionet që kemi përdorur për punën tonë. Tani mbetet vetëm të mësoni se si të shkruani të njëjtat shprehje të rregullta, të cilat janë parametri i parë i secilës prej këtyre metodave. Le të kalojmë te gjëja më e rëndësishme.

Si të shkruani fjali të rregullta

Së pari, le të shohim strukturat bazë. Shprehjet kanë opsione. Ato përcaktohen me një shkronjë dhe shkruhen në fund, të paraprira 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ë analizimin e modeleve tona të rregullta nga mësimi i fundit. Bazuar në shenjat e mësipërme, le të përpiqemi të kuptojmë se çfarë kemi. Ja shprehja:

/^]/i

Shenjat e para dhe të fundit "/" tregojnë se ka një shprehje të rregullt brenda tyre. Në të njëjtën kohë, pas të fundit që vendosëm "i", ky është një opsion, si në tabelën e parë - mos e merrni parasysh rastin. Brenda prerjeve është vetë sekuenca e rregullt. Fillon me shenjën më pak se dhe etiketën hyrëse, dhe gjithçka që vjen pas kësaj deri në shenjën e pikës është thjesht tekst i thjeshtë për t'u kërkuar. Por vetë pika dhe simbolet pas saj janë më interesante. Në këtë rast, ndërtimi ".*?" 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ë hasni ose një etiketë mbyllëse HTML "më shumë se" ose një karakter të ri rreshti. Ky dizajn na jep pikërisht një mundësi të tillë:

Karakteret në kllapa katrore lidhen me OR logjik. Fundi është shenja më e madhe se fillimi i rreshtit.
Kjo është e gjitha shprehja, në të vendosim kushtin e fillimit, të mesit dhe të mbarimit. Jo e vështirë, apo jo? Këtu është një ilustrim për qartësi:

Le të shohim edhe një gjë për të ngurtësuar gjithçka. Ne kërkuam lidhje me ta:

/]+?>(.*?)<\/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 se ne përdorim kodimin Unicode. Nuk ka mbetur shumë. Fillimi është etiketa "a", e cila hapet, pastaj vjen klasa

që do të thotë NUK më i madh ose më i vogël se (hapja dhe mbyllja e etiketave HTML), domethënë ndonjë karakter në këtë rast. “+?” 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". Ka tekst brenda lidhjes që specifikohet nga grupi

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

Ju lutemi vini re se ne i shpëtojmë vijës së pjerrët duke përdorur një vijë të prapme në mënyrë që të perceptohet si tekst i thjeshtë.

Phew. Tema është vërtet mjaft komplekse, kërkon praktikë. Ndoshta po bëj diçka jo në mënyrë optimale dhe është e mundur të krijoj shprehje të tjera të rregullta, më korrekte, por unë jam po aq autodidakt sa edhe ju, ndaj mos gjykoni rreptësisht, por ndani opsionet tuaja në komente. Gjithashtu, nëse diçka nuk është e qartë, faqja e komenteve dhe e kontaktit janë në shërbimin tuaj.




Top