Mis tahes tähemärk php regulaaravaldistes. Regulaaravaldised (mustrid)

) Näitasin teile näidet regulaaravaldiste kasutamisest lehe lähtekoodi konkreetsete osade leidmiseks. Nüüd õpime neid ise kirjutama. See oskus aitab teil kirjutada, puhastada teksti mittevajalikest fragmentidest, otsida vajalikke osi suurtest tekstimahtudest jne.

See teema on üsna keeruline, kuid püüan lühidalt käsitleda kõige olulisemaid punkte. Ma ei tea, kui edukas ma saan, kuid loodan, et õppetund on kasulik.
Alustame sellest, et PHP-s regulaaravaldistega töötamiseks on mitu funktsiooni, kuid kõige sagedamini kasutatakse kolme:

  • preg_replace — regulaaravaldisele vastava teksti otsimine ja asendamine;
  • preg_match – lihtsalt tavaline otsing;
  • preg_split – otsi ja jaga teksti.

Vähemalt eelmistes tundides kasutasime neid. Täpsemalt, preg_match asemel oli preg_match_all, aga see on sisuliselt sama asi, ainult viimane ei katkesta otsingut pärast esimest leidu. See tähendab, et kui kasutame preg_match, ei leia me kõiki esinemisi, vaid ainult esimest.

Missuguses olukorras kasutatava funktsiooni valimine on üsna lihtne. Peame asendama – kasutame asendamist, nagu ka siis, kui oli vaja eemaldada lehe koodi mittevajalikud osad, kas mäletate?

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

Funktsiooni esimene parameeter on tavaline märk, mis määrab, mida me otsime. Teine on see, millega me selle asendame. Kolmandaks – kuhu me vaatame? Seetõttu võtsime siin muutuja $page ja määrasime sellele funktsiooni preg_replace tulemuse, kus otsisime kõiki input type=checkboxi, samuti avamise ja sulgemise silte. Nad asendasid need tekstiga ", see tähendab, et nad lihtsalt kustutasid need. Loodan, et siin on kõik selge. Avaldise enda (funktsiooni esimese parameetri) analüüsimise juurde läheme veidi hiljem.
Seal oli ka näide preg_match_all kasutamisest, mis oli kasulik kõigi ülejäänud tekstist olevate linkide leidmiseks. Meil oli siis vaja linke, sest need sisaldasid märksõnu, mida me sõelusime. See juhtus järgmiselt.

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

Esimene parameeter on jällegi regulaaravaldis, et leida kõik lingid, mis on loomulikult "a" märgendis (kui te pole html-i märgistusega tuttav, siis lugege). Teine on muutuja, mis sisaldab otsitavat teksti. Kolmas parameeter on muutuja, millesse tulemus asetatakse – $ok. Pärast seda ei jää üle muud, kui läbida kõik $oki vajalikud elemendid, et saada vajalikud võtmed. Eraldi tuleks öelda, et väljundis saame mitmemõõtmelise massiivi. Seetõttu kuvasime seda nii keerulisel viisil: $ok[$j]. Massiivi struktuuri vaatamiseks kasutage allolevat funktsiooni ja saate kõigest aru.

Print_r($ok);

Tundub, et oleme oma töös kasutatavad funktsioonid ära sorteerinud. Nüüd jääb üle vaid õppida kirjutama samu regulaaravaldisi, mis on kõigi nende meetodite esimene parameeter. Liigume edasi kõige olulisema juurde.

Kuidas kirjutada tavalisi lauseid

Esiteks vaatame põhilisi struktuure. Väljenditel on valikud. Neid täpsustatakse ühe tähega ja kirjutatakse lõppu, millele eelneb kaldkriips.

Lisaks toetatakse järgmisi metamärke:

Metamärkidel võivad omakorda olla modifikaatorid:

Noh, nüüd saame jätkata viimase õppetunni tavapäraste mustrite analüüsimisega. Ülaltoodud märkide põhjal proovime aru saada, mis meil on. Siin on väljend:

/^]/i

Esimene ja viimane kaldkriips “/” näitavad, et nende sees on regulaaravaldis. Samal ajal, pärast viimast paneme “i”, see on valik, nagu esimeses tabelis - ära võta suur- ja täppistähte arvesse. Kaldkriipsude sees on tavaline jada ise. See algab vähem kui märgiga ja sisendsildiga ning kõik, mis sellele järgneb kuni punktimärgini, on lihtsalt otsitav tekst. Kuid punkt ise ja sümbolid pärast seda on huvitavamad. Sel juhul on konstruktsioon ".*?" tähendab mis tahes märgijada. See tähendab, et kui kombineerime ainult teksti ja selle konstruktsiooni, siis valime kogu teksti pärast esimest esinemist ja kuni lõpuni. Peatamiseks peate leidma kas sulgeva HTML-i "rohkem kui" märgendi või uue reamärgi. See disain annab meile just sellise võimaluse:

Nurksulgudes olevad märgid on ühendatud loogilise VÕI abil. Lõpp on suurem kui märk VÕI rea algus.
See on kõik väljend, selles määrame algustingimuse, keskmise ja lõputingimuse. Pole raske, eks? Siin on selguse huvides illustratsioon:

Vaatame veel üht asja, et kõike tahkuda. Otsisime nendega linke:

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

Lugesime väljendit. Jällegi jätame kõigepealt kõrvale kaldkriipsud ja valikud. Lipud "uis" on iseenesestmõistetavad, välja arvatud "u", mida ma ei kirjeldanud - see näitab, et kasutame Unicode'i kodeeringut. Pole palju jäänud. Algus on silt "a", mis avaneb, siis tuleb klass

mis tähendab, et EI ole suurem ega väiksem kui (HTML-siltide avamine ja sulgemine), see tähendab antud juhul ühtegi märki. Klassile lisatakse “+?”, mis tähendab, et see klass on kohal 1 või enam korda (aga vähemalt 1 kord kindlasti). Ja siis tuleb märgendi "a" sulgev html-märgend. Lingi sees on grupi määratud tekst

Lõppude lõpuks me ei tea, millist teksti seal on, nii et me määratleme sellise rühma. Ja lõpus on sulgev silt "a":

Pange tähele, et me eemaldame kaldkriipsu, kasutades kaldkriipsu, et seda tajutaks lihtsa tekstina.

Pheh. Teema on tõesti üsna keeruline, nõuab harjutamist. Võib-olla teen ma midagi mitte päris optimaalselt ja on võimalik luua muid korrektsemaid regulaaravaldisi, kuid olen sama autoõppija kui sina, nii et ärge otsustage rangelt, vaid jagage oma valikuid kommentaarides. Kui midagi jääb arusaamatuks, on kommentaaride ja kontaktide leht teie käsutuses.

Regulaaravaldised on väga võimas, kuid samas raskesti mõistetav stringitöötlustööriist. Kirjeldan põhipunkte. Regulaaravaldis on stringimuster. Selle malli abil saate otsida esinemisi, teha asendusi ja kontrollida mallile vastavust.

Mustri loomise reeglid

Malli piirid peavad olema tähistatud teatud sümbolitega, kasutades sageli " / ", aga ma eelistan kasutada" # ", sest edasi-/tagasikriipsude rohkus võib silmi pimestada ja räsimärke tavaliselt mujal ei kasutata. Seega: " #HereBodyRegularExpression#"

Regulaaravaldises kasutatakse sulgusid – need on alamväljendid, millega saab näiteks manipuleerida:

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

See avaldis on loodud parameetrite saamiseks stringis URL. Rea alguses on erimärk " ^ " - see tähendab rea algust. Järgmine tuleb " /kataloog/" - siin pole erimärke, see on lihtsalt tekst, mis peaks reas sisalduma. Siis leidsime sulgusid, st jõudsime esimese alamlauseni. Ruutsulud tähistavad paljusid märke, mis võivad selles kohas olla real. Märk " - " tähendab loendust. Märk " \ " väldib erimärke. Seega võib esimeses alamavaldises olla SUUR ja ladina tähestiku väikesed tähed, numbrid 0 kuni 9, allkriips, sidekriips ja punkt. Kriips ja punkt on erimärgid, kuid siin on need on põgenenud, nii et siin on vaid sümbolid nurksulgude järel on märk ". + " - see tähendab, et eelmine märk (ja meie jaoks on see nurksulgudes määratud märkide komplekt) võib esineda 1 või enam korda. Siis tuleb " / " on lihtsalt sümbol ja sarnane teine ​​alamväljend. Siis tuleb " \.html"mida tekst tähendab" .html". Ja siis erimärgid" .* "Punkt tähendab mis tahes tähemärki ja tärn tähendab mis tahes kogust eelmisest märgist. See tähendab pärast " .html"Kõik võib minna.

Koguse märkimine, kvantorid

Eespool oleme juba käsitlenud selliseid sümboleid, mis näitavad varasemate sümbolite arvu, näiteks + Ja * . Siin on kõik võimalused koguse määramiseks:

Eritegelased

Mõne märgirühma jaoks on olemas spetsiaalsed lühendid:

"Ahnus"

Vaatame regulaaravaldise ahnuse mõistet. Näiteks on rida:

#()#

Loeme: alaavaldis:

Kõik näib olevat õige, alamväljend sobib:

Aga sobib ka:

Seda me saame, sest... Regulaaravaldised on vaikimisi ahned. Ahnuse saate eemaldada modifikaatoriga " U", nagu nii:

#()#U

Modifikaatorid

Regulaaravaldisele võivad järgneda modifikaatorid: " #HereBodyRegularExpression#HereModifiers"Modifikaatorite tüübid:

i Võimaldab tõstutundlikku režiimi, st. suured ja väikesed tähed väljendis ei erine.
m Näitab, et otsitavat teksti tuleks käsitleda mitmest reast koosnevana. Vaikimisi käsitleb regulaaravaldise mootor teksti ühe stringina, olenemata sellest, mis see tegelikult on. Vastavalt metategelased "^" ja "$" näitavad kogu teksti algust ja lõppu. Kui see modifikaator on määratud, näitavad need vastavalt iga tekstirea algust ja lõppu.
s Vaikimisi metamärk on " . " ei sisalda definitsioonis reavahetusmärki. Selle modifikaatori määramine eemaldab selle piirangu.
U Eemaldab regulaaravaldise ahnuse
u Võimaldab regulaaravaldiste kasutamist Kirillitsa kuni UTF-8, muidu see ei tööta korralikult.

php Funktsioonid regulaaravaldistega töötamiseks

preg_replace

Otsige ja asendage:

Preg_replace (sega $muster , sega $asendus , sega $subjekt [, int $limit = -1 [, int &$count ]]);

Iga väärtus võib olla string või massiiv $teema massiiv - tagastatakse massiiv, vastasel juhul string

preg_split

Tükeldab stringi regulaaravaldise abil:

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

Tagastab massiivi, mis koosneb antud stringi alamstringidest teema, mis on jagatud mööda mustrile vastavaid piire muster.

Alustame sellest, mis on regulaaravaldis. Nii et vastake mulle sellele küsimusele: kas sõnas "test" on "e"? "Sööma!" sa ütled. Seejärel esitan teile teise küsimuse, kuidas leidsite sõnast "test" tähe "e"? Vastus on ilmne, võtame esimese tähemärgi, see tähendab "t" ja võrdleme seda otsitavaga, see tähendab "e"-ga. Kui need ei ole võrdsed, võtame teise tähemärgi, see tähendab "e" ja võrdleme seda otsitavaga, see tähendab "e". Voila! Sobivus leiti. Vastus: Sõna "test" sisaldab tähte "e".

Nüüd vasta mulle veel ühele küsimusele, kus on selle näite regulaaravaldis? Loodan, et arvasite, et siin on regulaaravaldis see, mida me sõnast "test" otsime. See tähendab, et täht "e" on selles näites regulaaravaldis.

Mille jaoks kasutatakse PHP-s regulaaravaldisi? Minu praktikas kasutati regulaaravaldisi näiteks selleks, et teha kindlaks, kas meiliaadress on õigesti koostatud. Selliseid väljendeid kasutatakse ka kasutajanime ja parooli õigsuse määramiseks. Regulaaravaldiste abil leiate lingist aadressi ja salvestate selle. Seda analüüsides saate kindlaks teha regulaaravaldiste põhifunktsioonid ja kaks kõrvalfunktsiooni. Peamine funktsioon, see on vastete otsing stringist. Kõrvalmõjudeks on leitud vastete salvestamine ja asendamine.

Esimene regulaaravaldis

Teoreetiliselt mõistame, kuidas leida sõna "test" tähemärki "e", kuid kuidas seda praktikas rakendatakse? Regulaaravaldiste kasutamiseks php-s kasutatakse tavaliselt järgmisi funktsioone:

preg_match("regulaaravaldis (muster)", "muutuja, milles otsitakse", "Muutuja, millesse otsingutulemus salvestatakse (valikuline parameeter)"); - Sobivusfunktsioon
preg_replace("regulaaravaldis (muster)", "Millega asendada leitud vaste", "muutuja, millesse asendus tehakse"); - Asendusfunktsioon

Alustame nende funktsioonide kasutamist Siin on näide tähe "e" otsimisest sõnas "test":

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

Kood kirjeldab tingimust: kui muutujas $a leitakse midagi mustriga sobivat, kuvatakse teade "leitud!!" Nagu olete märganud, asub meie mall kahe "/" vahel. Sel juhul sümbol "/" sümboliseerib meie mustri algust ja lõppu. Loodan, et see on selge.

See kõik on muidugi huvitav... aga meie mall on väga lihtne, kas sa ei arva? Lõppude lõpuks on meil harva vaja muutujas mõnda sümbolit leida. Enamasti peame leidma palju tegelasi ja ka tundmatuid. Kuidas olla? Seadkem endale probleem ja proovime seda lahendada. Oletame, et meil on string, mis koosneb numbritest ja ühest tundmatust ingliskeelsest tähest

Kuidas seda kirja leida? Inglise tähestikus võib olla mis tahes täht, kuidas saate seda tuvastada? Vastasite ise oma küsimusele, seal on suvaline täht, see tähendab, et see on vahemikus a kuni z. Regulaaravaldistes saate kasutada vahemikke. Kui me ei tea, millist tähemärki otsime, kuid teame kindlalt, et see täht on inglise tähestiku täht, siis on kirje järgmine:

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

Pange tähele, et vahemik on sulgudes "[" "]". Kõik sellistesse sulgudesse jääv on määratletud kui üks sümbol, antud juhul on sümbol vahemikus a kuni z. Kui peame leidma mitte tähe, vaid numbri, on kirje järgmine:

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

Samuti tahan märkida, et regulaaravaldised on tõstutundlikud, seega on märgid "A" ja "a" täiesti erinevad. Mõlema märgi otsimiseks kirjutage järgmiselt:

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

Samuti otsitakse vene tähti, mis viiakse läbi samamoodi nagu ingliskeelsete tähtede puhul:

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

Metategelased

Õppisime stringist tundmatut tähemärki otsima. Mida teha, kui peame leidma mitu tegelast? Appi tulevad nn metasümbolid... Oletame, et meil on numbrite ja tähtedega string, kuidas seda mallis kirjeldada? Sa suudad seda:

rida - 123a321
näidis -

Hmm... mall vastab tegelikult meie stringile ja vastavuse kontrollimisel annab see kauaoodatud tõe! Kuid see on omamoodi tülikas plaat, kas te ei arva?

Selle lühendamiseks tehke järgmist.

rida - 123a321
näidis - *

Mulle tundub, et see on lühem. Mis on "*" sümbol? See on sama metasümbol, see tähendab, et meie kirjeldatud sümbolit (nimelt sümbolit, mis võib sisaldada numbreid 0 kuni 9 või ingliskeelse tähestiku tähti alates a kuni z) saab korrata lõputult või rohkem kui üks kord. Jah Jah! See metasümbol leiab vaste tühjas muutujas, kuna isegi kirjeldatud sümboli puudumine tagastab tõese! Mäleta seda

Milliseid metamärke seal veel on?

Näiteks metamärk "+" See on ühe väikese erandiga peaaegu sarnane metamärgiga "*". "*" tagastab tõene isegi siis, kui märki pole, ja "+" kontrollib vähemalt ühe märgi olemasolu. See tähendab, et kui rida nõuab kohalolekut miinimumüks märk, siis kasutage "*" asemel "+"

Sageli kasutatakse ka metamärki "?". See tähendab, et rida ei tohi sisaldada rohkem kui ühte soovitud tähemärki. Lubage mul tuua paar näidet kahe viimase kirjeldatud metamärgi kohta.

Oletame, et peame kontrollima kasutaja parooli õigsust. Mõelgem, mida peaks kasutaja parool sisaldama? Esiteks peab see olema vähemalt üks tegelane. Teiseks peab see sisaldama ainult ingliskeelse tähestiku numbreid ja tähti, nii et regulaaravaldis näeb välja selline:

$a = "qwerty12345";

Milliseid tegelasi lubame? Ingliskeelsed tähed ja numbrid. Proovige nüüd parooli asemel tühja rida jätta.

$a = "";
if(preg_match("/+/",$a)) echo "Parool on õige";

Te ei näe teadet "Parool on õige". Miks? Kuna "+" metamärk kontrollis stringi, et näha, kas sellel on vähemalt üks märk.

Ja nüüd väike nipp, vaatame oma näoilmet, me ei lubanud, noh, ütleme, et seal on tühik, eks? pane parooli lõppu tühik ja käivita

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Parool on õige";

Ja miks me näeme oma sõnumit õige parooli kohta? See on üsna lihtne... Funktsioon preg_match(); peatab selle kontrolli esimesel matšil. See tähendab, et sümbol “q” sobib meie kirjeldatud mustriga ja kõik muu pole funktsiooni jaoks enam oluline. Mida me peaksime tegema? Selle parandamiseks tehke järgmist.

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Parool on õige";

Lisades avaldise algusesse "^" ja lõppu "$", ütleme funktsioonile, millega muster peaks vastama kõik rida. Kui käivitate selle koodi, ei näe te sõnumit, kuna parooli lõpus on keelatud märk - tühik

Nüüd muutke metamärk "+" metamärgiks "?". Mis sa arvad, mis juhtub? Õigesti parooli õigsuse kohta teadet ei kuvata, kuna parool sisaldab rohkem kui ühte tähemärki. Loodan, et selgitasin õigesti nende kolme sageli kasutatava metategelase tööd

Mõnikord on "mitte" parem

Oleme vähemalt õppinud parooli õigsust kontrollima ja see on hea! Lubage mul rääkida veel ühest viisist, kuidas stringist midagi otsida. Oletame, et peame kontrollima, kas stringis pole numbreid. Kuidas seda teha? Siin on rida:

(Sellesse panin spetsiaalselt need "-_+()" sümbolid sisse, et elu ei tunduks mesine...) Võiksime sõnastada järgmise väljendi:

Kuid peate tunnistama, et me ei tea alati, milliseid märke reas kasutatakse, kuid teame kindlalt, et selles ei tohiks olla numbreid! Seetõttu oleks loogilisem kirjutada lihtsalt mall, mis jätaks vahele read, milles Ei numbrid, mitte need, milles see on "Oh issand, kui palju arusaamatuid sümboleid!!!". Siin on näide selliste probleemide jaoks õigesti koostatud väljendist:

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

Kuidas me selle saavutasime? Oleme sümboli sisestanud Aga! alguses asetatud müts "^" ([^0-9]) näitab, et neid tuleb ei peaks Loodan, et see asi on lahendatud

Noh, paneme asja aeglaselt kokku... Toon kaks näidet koos selgitustega, mille käigus õpime, kuidas salvestada otsingutulemused muutujaks ja kuidas kontrollida postiaadressi õigsust

Ma nägin seda ja päästsin selle!

Minu blogi

$a = " Minu blogi";
preg_match("/ /", $a);

Meie regulaaravaldises kirjeldasime kõiki võimalikke märke, mida saab linki lisada. Tahaksin pöörata tähelepanu ka meie väljendis olevatele tsitaatidele ja „/”-märkidele. Nende ees on kaldkriips, milleks see on? Fakt on see, et "/" ja tsitaat on ise erimärgid. Ja selleks, et mall neid tavaliste sümbolitena tajuks, peame need läbi sõeluma. Põgenemine toimub, lisades erimärkide ette kaldkriipsu. Loodan, et see on selge

$a = " Minu blogi";
preg_match("/ /", $a, $b);

Noh, vastavalt sellele on vaja lisada täiendav parameeter muutuja $b kujul, millesse leitud link salvestatakse. Samuti peate teadma, et otsingutulemus paigutatakse massiivi. Seetõttu on muutuja $b massiiv. Info, mida otsime, on indeksi 1 all. See tähendab, et otsingutulemus on muutujas $b. Kuvame tulemuse ekraanil:

$a = " Minu blogi";
preg_match("/ /", $a, $b);
kaja $b;

Õige aadress on edu võti!

Ja lõpuks vastus küsimusele, kas e-kiri on õige? Esiteks peate teadma, millised tähemärgid on aadressides lubatud? Minu teada on lubatud tähemärgid järgmised:

  • Ingliskeelsed tähed, numbrid, “_”, “-” ummmm kõik tundub olevat... Lähtume sellest.
  • Järgmisena on meil "@"
  • Pärast ingliskeelseid tähti
  • Järgmine, punkt
  • Ja jälle ingliskeelsed tähed...

Seega on regulaaravaldis järgmine:

$a = " [e-postiga kaitstud]";
if(preg_match("/^+@+.+$/", $a)) echo "e-posti aadress on õige!";
else echo "e-posti aadress EI OLE õigesti kirjutatud!";

No ma loodan, et sellised plaadid teid nüüd ei hirmuta ja saate neist täiesti aru.

Lõpetuseks tahan ma midagi öelda. Artikkel osutus tülikaks ja hõlmas samas vaid osa võimalustest. Kui loete seda lauset, siis suure tõenäosusega olete selle lõpuni lugenud, mille eest tänan teid väga

Mis puudutab artiklite sarja cms ajaveebi arendamisest, siis sarja esimene osa Ma kuulutan selle suletuks! Lähitulevikus hakkame juurutama administraatoripaneeli, nii et ärge "lülitage" Kui teil on küsimusi, vastan hea meelega. Kõike paremat teile, see on kõik, mis mul on!