Numerot ovat säännöllinen lauseke php:ssä. Hyödyllisiä säännöllisiä lausekkeita PHP:lle. Kattava salasanan vahvistus


Yksi PHP-kielen erittäin tehokkaista ja hyödyllisistä ominaisuuksista on sen säännöllisten lausekkeiden tuki. Monet ohjelmoijat, sekä aloittelijat että melko kokeneet, pelkäävät säännöllisten lausekkeiden kielen ilmeistä monimutkaisuutta ja monimutkaisuutta. Mutta voin vakuuttaa teille - se on sen arvoista. Säännöllisten lausekkeiden käyttö yksinkertaistaa huomattavasti tekstien ja heikosti jäsenneltyjen tietojen käsittelyä.


Säännölliset lausekkeet ovat erityisellä kielellä kirjoitettuja lausekkeita.Älä huolestu, kieli on melko helppo ymmärtää, tarvitset vain kokemusta ja harjoittelua.


Luulen, että olet toistuvasti kohdannut tilanteita, joissa sinulla on tekstiä (esimerkiksi Microsoft Wordissa) ja sinun on löydettävä siitä jotain tärkeää. Jos tiedät tarkalleen mitä etsit, kaikki on yksinkertaista: avaa hakuikkuna, kirjoita hakusana, paina painiketta ja voila - teksti löytyy.


Mutta mitä teet, jos tiedät vain etukäteen, minkä tyyppistä tietoa etsit? Sinulla on esimerkiksi tehtävä löytää kaikki sähköpostiosoitteet parin sadan arkin asiakirjasta. Jotkut tarkastelevat asiakirjaa manuaalisesti, jotkut kirjoittavat koiran (@) hakuun ja etsivät sitä. Samaa mieltä - molemmat vaihtoehdot ovat takaiskuja, kiittämätöntä työtä.

Tässä säännölliset lausekkeet tulevat apuun. Joillakin likimäärillä säännöllisiä lausekkeita voidaan verrata maskeihin tai malleihin, jotka on asetettu tekstin päälle: jos teksti vastaa maskia, tämä on haluttu fragmentti. Mutta ennen kuin harkitsemme säännöllisten lausekkeiden käyttöä, tutustumme niiden syntaksiin.

Säännöllinen lauseke on tiettyjen lakien ja sääntöjen mukaan muodostettu tekstijono. Merkkijono koostuu merkeistä ja merkkiryhmistä, metamerkkeistä, kvantoijista ja muuntimista.

Tässä tapauksessa symbolit tarkoittavat mitä tahansa minkä tahansa aakkoston symboleja. Eikä vain luettavia. Voit melko helposti lisätä lauseeseen lukemattoman merkin, sinun tarvitsee vain tietää sen koodi heksadesimaalimuodossa. Esimerkiksi:

// luettavat merkit a E // lukemattomat merkit ja koodit \x41 - sama kuin kirjain "A" \x09 - sarkainmerkki

Merkkiryhmä on useita peräkkäin kirjoitettuja merkkejä:

Abvg ACZms

Haluaisin heti kiinnittää huomionne - säännöllisten lausekkeiden "välilyönti" on myös merkittävä merkki, joten ole varovainen ilmaisuja kirjoittaessasi. Esimerkiksi nämä merkkiryhmät ovat ERI ilmauksia:

ABC WHERE ABC WHERE

Kielen seuraava elementti on metamerkit. Etuliite "meta" tarkoittaa, että nämä symbolit kuvaavat joitain muita symboleja tai niiden ryhmiä. Taulukko kuvaa säännöllisen lausekkeen kielen tärkeimmät metamerkit:

Metamerkit erikoismerkkien määrittämiseen
() Sulut. Määrittää sisäkkäiset lausekkeet.
| Valinnan metahahmo
^ Rivin alun metamerkki
$ Rivin lopun metamerkki
\n Rivinsyöttömerkki (heksadesimaalikoodi 0x0A)
\r Kärryn palautusmerkki (heksadesimaalikoodi 0x0D)
\t Sarkainmerkki (heksadesimaalikoodi 0x09)
\xhh Jos lisäät merkin heksadesimaalikoodilla 0xhh, esimerkiksi \x42, lisää latinalaisen kirjaimen "B"
Metamerkit merkkiryhmien määrittämiseen
. Piste. Mikä tahansa hahmo.
\d Numero (0-9)
\D Ei numero (mikään merkki paitsi merkit 0-9)
\s Tyhjä merkki (yleensä välilyönti ja sarkain)
\S Ei-tyhjä merkki (kaikki paitsi merkit, jotka tunnistetaan \s-metamerkillä)
\w Sanakirjamerkki (merkki, jota käytetään sanoissa. Yleensä kaikki kirjaimet, kaikki numerot ja alaviiva ("_"))
\W Kaikki paitsi \w-metamerkin määrittelemät merkit

Taulukon toisen puoliskon metahahmot ovat erittäin helppo muistaa. "d" - numero (numero), "s" - symboli (symboli), "w" - sana (sana). Jos kirjain on suuri, sinun on lisättävä "EI" ryhmän kuvaukseen.

Otetaan esimerkiksi teksti "Punaisessa paidassa on numerot 1812 ja vihreässä paidassa on 2009". Katsotaanpa esimerkkejä yksinkertaisimmista säännöllisistä lausekkeista:

\d\d\d\d - löytää 1812 ja 2009 \D - löytää kaikki kirjaimet, välilyönnit ja välimerkit \s - löytää kaikki välilyönnit tekstistä.

Mutta esimerkkimme vuosi voidaan kirjoittaa ei neljällä, vaan kahdella numerolla, sanoilla voi olla muita käänteitä jne. Hakasulkeilla määritetyt merkkien osajoukot voivat auttaa tässä:

Tarkoittaa mitä tahansa numeroa (sama kuin \d) - tarkoittaa parillista numeroa - tarkoittaa mitä tahansa latinalaisten aakkosten symbolia (joka tapauksessa) tai numeroa.

Esimerkiksi lauseke \d\d\d testimerkkijonossa löytää vain numeron 1812, mutta ei 2009. Tämä lauseke tulee lukea seuraavasti: "etsi kaikki neljän numeron sekvenssit, joissa viimeinen numero on 0,2,4,6 tai 8".

Meillä on vain mainittava kvantitaattorit ja modifioijat.

Kvantifioija on erityinen rakenne, joka määrittää, kuinka monta kertaa hahmon tai merkkiryhmän tulee esiintyä. Kvantifioija on kirjoitettu kaareviin hakasulkeisiin "()". Kaksi tallennusmuotoa on mahdollista: tarkka ja alue. Tarkka muoto on kirjoitettu näin:

Tässä X on kuinka monta kertaa edellinen symboli tai ryhmä on toistettava. Esimerkiksi ilmaisu

Toinen tallennusmuoto on alue. Tallennettu nimellä

(X, Y) // tai (,Y) // tai (X,)

jossa X on pienin ja Y on toistojen enimmäismäärä. Esimerkiksi:

luetaan "kahdesta neljään numeroa kirjoitettuna peräkkäin". Jos jotakin rajoista ei ole määritetty, rajoitusta ei oletettu. Esimerkiksi:

\w(3,) - kolme tai useampia kirjaimia. \d(,5) - numeroita ei ole ollenkaan tai niitä on, mutta enintään viisi.

Määrittäjiä voidaan käyttää joko yksittäiseen merkkiin tai ryhmään:

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

Tämä rakenne valitsee tekstistä kaikki yhden, kahden tai kolmen kirjaimen venäläiset sanat (esimerkiksi "tai", "ei", "minä", "menen" jne.)

Kiharaisten aaltosulkeiden lisäksi on kolme muutakin kvantorimetamerkkiä: “*” (tähti), “+” (plus) ja “?” (kysymys). Niitä käytetään tapauksissa, joissa vaadittujen toistojen vähimmäis- ja enimmäismäärää ei tiedetä etukäteen. Esimerkiksi sähköpostiosoitteita haettaessa ei voi etukäteen tietää, kuinka monta merkkiä käyttäjätunnuksessa on (ennen "koira") ja kuinka monta on verkkotunnuksen nimessä (koiran jälkeen).

Metamerkki "*" luetaan "mikä tahansa määrä nollasta tai enemmän", ts. design

määrittää minkä tahansa määrän peräkkäisiä kirjaimia, mukaan lukien niiden täydellinen puuttuminen.

"+"-symboli eroaa tähdestä vain siinä, että se vaatii vähintään yhden merkin. Ne. design

vastaa mitä tahansa digitaalista sekvenssiä, jossa on yksi tai useampi numero.

Symboli "?" vastaa yhden merkin puuttumista tai läsnäoloa. Ne. design

vastaa mitä tahansa digitaalista sekvenssiä, jossa on yksi tai kaksi numeroa.

Tässä on syytä mainita sellainen antiifiers “*” ja “+” ominaisuus kuin ahneus. Asia on, että oletusarvoisesti nämä merkit vastaavat pisintä mahdollista merkkijonoa. Esimerkiksi riville "äiti pesi kehyksen" lauseke:

valitsee "mama soap ra", mikä on hieman odottamatonta, koska odotimme saavamme "ma". Jos haluat muuttaa tätä toimintaa, käytä metamerkkiä "?" (kysymysmerkki) kirjoitetaan välittömästi kvantisoijan jälkeen. Se rajoittaa kvantorien "ruokahalua" pakottamalla ne palauttamaan ensimmäisen ottelun pisimmän sijaan. Muutetaan nyt edellistä esimerkkiä:

ja hanki tarvittava ottelu "ma".

Kielen viimeinen elementti on modifioijia. Muokkaus on erikoismerkki, joka määrittää "järjestelmä"-parametrit säännöllisten lausekkeiden analysointiin. Tällaisia ​​symboleja on vain neljä, niitä voidaan käyttää joko yksittäin tai samanaikaisesti:

i Ottaa käyttöön tilan, jossa kirjainkoolla ei ole merkitystä, ts. isot ja pienet kirjaimet lausekkeessa eivät eroa toisistaan.
m Osoittaa, että etsittävää tekstiä tulee käsitellä useista riveistä koostuvana. Oletuksena säännöllinen lausekemoottori käsittelee tekstiä yhtenä merkkijonona riippumatta siitä, mitä se todellisuudessa on. Vastaavasti metamerkit "^" ja "$" osoittavat koko tekstin alun ja lopun. Jos tämä muokkaaja on määritetty, ne osoittavat vastaavasti kunkin tekstirivin alun ja lopun.
s Oletusmetamerkki on "." ei sisällä rivinvaihtomerkkiä määritelmässään. Ne. moniriviselle tekstille lauseke /.+/ palauttaa vain ensimmäisen rivin, ei koko tekstiä odotetusti. Tämän muuntajan määrittäminen poistaa tämän rajoituksen.
U Tekee kaikki kvantitatiiviset metamerkit oletuksena "ei ahneiksi". Joissakin kielen muunnelmissa (erityisesti PHP:ssä) "U":n sijasta käytetään symbolia "g", mikä vastaa paremmin merkitystä ("g" on lyhenne englannin sanoista "greedy", "greedy" ").

Taulukko näyttää suosituimmat ja tarpeellisimmat esimerkit säännöllisistä lausekkeista. Jotkut niistä saattavat tuntua monimutkaisilta ja hankalia, mutta yksityiskohtaisen tutkimuksen avulla ymmärrät varmasti.

Säännölliset lausekkeet PHP:ssä.

Säännöllisten lausekkeiden kanssa työskentelemiseen PHP:ssä on erikoistoimintoja, joista luettelo ja lyhyt kuvaus on annettu taulukossa:

int preg_match (merkkijonomalli, merkkijonon aihe [, matriisiosumat])

Toiminto tarkistaa, vastaako kohteen sisältö kuviomallia. Palauttaa 1, jos osumia löytyy, muussa tapauksessa palauttaa 0. Jos määrität valinnaisen matches array -parametrin, funktiota suoritettaessa siihen syötetään yksi elementti - ensimmäinen löydetty vastaavuus.

"; print_r($found); ?>

int preg_match_all (merkkijonomalli, merkkijonon aihe, taulukko vastaa [, int järjestys])
Funktio on identtinen edellisen kanssa, ainoalla erolla - se hakee koko tekstistä ja palauttaa KAIKKI osumataulukosta löytyneet osumat.
sekoitettu preg_replace (sekakuvio, sekoitettu korvaus, seka aihe [, väliraja])
Kuten molemmat edeltäjänsä funktiot, preg_replace etsii tekstiä, joka vastaa kuviota. Funktio korvaa kaikki löydetyt fragmentit parametreissa määritetyllä tekstillä.Ennen puhdistusta:\n$teksti\n\n"; $teksti = preg_replace("/(\n \s(2,))/"," ",$teksti); kaiku " Puhdistuksen jälkeen:\n$text"; // näyttää tekstin, joka on poistettu erikoismerkeistä // ja ylimääräisistä välilyönneistä?>
sekoitettu preg_replace_callback (sekoitettu kuvio, sekoitettu takaisinsoitto, seka aihe [, väliraja])
Toiminto on laajennettu versio edellisestä. Suurin ero on, että tälle funktiolle välitetään parametreissa sen funktion nimi, joka analysoi tekstin ja luo korvaavan tekstin.
taulukko preg_split (merkkijonokuvio, merkkijonon aihe [, int limit [, int liput]])
Tämä funktio on samanlainen kuin explode()- ja split()-funktiot. Sen erikoisuus on, että erotin ei ole kiinteä merkkijono, vaan säännöllinen lauseke. Funktio jakaa lähdetiedot elementeiksi ja sijoittaa ne tulostaulukkoon.
taulukko preg_grep (merkkijonokuvio, taulukon syöttö)
Toiminto on suunniteltu säännölliseen taulukkohakuun. Hakua varten määritetään malli ja syötetietojen joukko, ja palautetaan matriisi, joka koostuu vain mallia vastaavista elementeistä.

Tarkasteltavien funktioiden luettelo ei ole läheskään täydellinen, mutta se on aivan riittävä säännöllisten lausekkeiden käytön aloittamiseen. Jos olet kiinnostunut tästä aiheesta, muista lukea lisää kirjallisuutta (esimerkiksi Friedlin kirja "Säännölliset lausekkeet"). Lisäksi suosittelen koulutustarkoituksiin jonkin säännöllisten lausekkeiden testaamiseen tarkoitetun erikoisohjelman asentamista (esimerkiksi "PCRE" tai "RegEx Builder").

Työskennellessään tekstien kanssa millä tahansa nykyaikaisella ohjelmointikielellä kehittäjät kohtaavat jatkuvasti tehtäviä tarkistaa syötetyt tiedot halutun mallin mukaisuuden suhteen, etsiä ja korvata testifragmentteja sekä muita tyypillisiä symbolisten tietojen käsittelytoimintoja. Omien varmennusalgoritmien kehittäminen johtaa ajanhukkaan, ohjelmakoodin yhteensopimattomuuteen ja monimutkaisuuteen sen kehittämisessä ja modernisoinnissa.

Internetin ja WEB-kehityskielten nopea kehitys vaati universaalien ja kompaktien työkalujen luomista tekstitiedon käsittelyyn, jossa on tähän tarvittava vähimmäismäärä koodia. Aloittelijoiden ja ammattikehittäjien keskuudessa suosittu PHP-kieli ei ole poikkeus. Säännöllinen lauseke tekstipohjakielenä mahdollistaa tekstinkäsittelytehtävien yksinkertaistamisen ja ohjelmakoodin vähentämisen kymmenillä ja sadoilla riveillä. Monia ongelmia ei voida ratkaista ilman sitä.

Säännölliset lausekkeet PHP:ssä

PHP-kieli sisältää kolme mekanismia säännöllisten lausekkeiden kanssa työskentelemiseen - "ereg", "mb_ereg" ja "preg". Yleisin on "preg"-käyttöliittymä, jonka toiminnot tarjoavat pääsyn PCRE:n säännölliseen lausekekirjastoon, joka on alun perin kehitetty PHP:n mukana tulevalle Perl-kielelle. Preg-funktiot etsivät annetusta tekstijonosta osumia tietyn mallin mukaan säännöllisen lausekkeen kielessä.

Syntaksin perusteet

Lyhyessä artikkelissa on mahdotonta kuvata yksityiskohtaisesti koko säännöllisten lausekkeiden syntaksia. Esittelemme vain pääelementit näyttääksemme kehittäjän laajat mahdollisuudet ja ymmärtääksemme koodiesimerkkejä.

B on muodollisesti määritelty hyvin monimutkaisella tavalla, joten yksinkertaistetaan kuvausta. Säännöllinen lauseke on tekstimerkkijono. Se koostuu rajatusta kuviosta ja muokkaajasta, joka osoittaa kuinka se käsitellään. Malleihin on mahdollista sisällyttää erilaisia ​​vaihtoehtoja ja toistoja.

Esimerkiksi lausekkeessa /\d(3)-\d(2)-\d(2)/m erotin tulee olemaan «/» , sitten tulee kuvio ja symboli "m" tulee olemaan muuntaja.

Kaikki säännöllisten lausekkeiden voima on koodattu metamerkkien avulla. Kielen tärkein metamerkki on kenoviiva - "\". Se kääntää sitä seuraavan merkin tyypin (eli tavallisesta hahmosta tulee metahahmo ja päinvastoin). Toinen tärkeä metamerkki on vinoviiva "|", joka määrittää mallin vaihtoehtoiset muunnelmat. Lisää esimerkkejä metahahmoista:

PHP käsittelee säännöllisiä lausekkeita käsitellessä välilyöntiä erillisenä merkitsevänä merkkinä, joten lausekkeet ABCWHERE ja ABCWHERE ovat erilaisia.

Alakuviot

PHP:ssä tavalliset alimallit erotetaan suluilla ja niitä kutsutaan joskus "alilausekkeiksi". Suorita seuraavat toiminnot:

    Vaihtoehtojen korostaminen. Esimerkiksi malli lämpö(jotain|lintu|) vastaa sanoja "lämpö", "tulilintu" Ja "paisti". Ja ilman sulkuja se olisi vain tyhjä merkkijono, "lintu" ja "paisti".

    "Jännittävä" alamalli. Tämä tarkoittaa, että jos alimerkkijono vastaa kuviota, kaikki osumat palautetaan tuloksena. Selvyyden vuoksi annetaan esimerkki. Kun annetaan seuraava säännöllinen lauseke: voittaja saa ((kultainen|kullattu)(mitali|kuppi)) - ja rivi osumien etsimiseksi: "voittaja saa kultamitalin". Alkuperäisen lauseen lisäksi hakutulos palauttaa: "kultamitali", "mitali", "kulta".

Toistooperaattorit (neljästimet)

Säännöllisiä lausekkeita kirjoitettaessa on usein tarpeen analysoida numeroiden ja symbolien toistoja. Tämä ei ole ongelma, jos toistoja ei ole kovin paljon. Mutta mitä tehdä, kun emme tiedä niiden tarkkaa lukumäärää? Tässä tapauksessa sinun on käytettävä erityisiä metamerkkejä.

Toistojen kuvaamiseen käytetään quadrifiers - metasymbolit määrittämään määrää. Quadrifiereja on kahta tyyppiä:

  • yleinen, suluissa;
  • lyhennettynä.

Yleinen kvantori määrittää elementin sallittujen toistojen vähimmäis- ja enimmäismäärän kahdella numerolla aaltosulkeissa, seuraavasti: x(2,5). Jos toistojen enimmäismäärää ei tiedetä, toinen argumentti jätetään pois: x(2,).

Lyhyet kvantisoijat edustavat yleisimpien toistojen symboleja tarpeettoman syntaksisen sotkun välttämiseksi. Yleisesti käytetään kolmea lyhennettä:

1. * - nolla tai useampi toisto, mikä vastaa (0,).

2. + - yksi tai useampi toisto, eli ,).

3. ? - nolla tai vain yksi toisto - (0,1).

Esimerkkejä säännöllisistä lausekkeista

Niille, jotka oppivat säännöllisiä lausekkeita, esimerkit ovat paras opetusohjelma. Esittelemme muutamia, jotka osoittavat niiden laajat ominaisuudet vähäisellä vaivalla. Kaikki ohjelmakoodit ovat täysin yhteensopivia PHP-versioiden 4.x ja uudempien kanssa. Syntaksin täysin ymmärtämiseksi ja kielen kaikkien ominaisuuksien käyttämiseksi suosittelemme J. Friedlin kirjaa “Regular Expressions”, joka käsittelee syntaksia perusteellisesti ja sisältää esimerkkejä säännöllisistä lausekkeista paitsi PHP:ssä, myös Pythonissa, Perlissä, MySQL:ssä, Java, Ruby ja C#.

Sähköpostiosoitteen oikeellisuuden tarkistaminen

Tehtävä. Internetissä on sivu, joka pyytää vierailijalta sähköpostiosoitetta. Säännöllisen lausekkeen on tarkistettava, että vastaanotettu osoite on oikein ennen viestien lähettämistä. Tarkistus ei takaa, että määritetty postilaatikko todella on olemassa ja hyväksyy kirjeet. Mutta se voi karsia pois ilmeisen virheelliset osoitteet.

Ratkaisu. Kuten millä tahansa ohjelmointikielellä, PHP-sähköpostiosoitteen vahvistuksen säännölliset lausekkeet voidaan toteuttaa useilla tavoilla, eivätkä tämän artikkelin esimerkit ole kaikki ja loput. Siksi annamme jokaisessa tapauksessa luettelon vaatimuksista, jotka on otettava huomioon ohjelmoitaessa, ja konkreettinen toteutus riippuu täysin kehittäjästä.

Joten lausekkeen, joka tarkistaa, onko sähköposti kelvollinen, on tarkistettava seuraavat ehdot:

  1. @-symbolin läsnäolo lähdemerkkijonossa ja välilyöntien puuttuminen.
  2. Osoitteen verkkotunnusosa, jota seuraa @-symboli, sisältää vain verkkotunnusten kelvollisia merkkejä. Sama koskee käyttäjätunnusta.
  3. Kun tarkistat käyttäjätunnusta, sinun on etsittävä erikoismerkkejä, kuten heittomerkki tai Nämä merkit ovat mahdollisesti vaarallisia ja niitä voidaan käyttää hyökkäyksissä, kuten SQL-injektiossa. Vältä tällaisia ​​osoitteita.
  4. Käyttäjätunnukset sallivat vain yhden pisteen, joka ei voi olla rivin ensimmäinen tai viimeinen merkki.
  5. Verkkotunnuksen nimessä tulee olla vähintään kaksi ja enintään kuusi merkkiä.

Alla olevassa kuvassa on esimerkki, joka ottaa huomioon kaikki nämä ehdot.

URL-osoitteiden oikeellisuuden tarkistaminen

Tehtävä. Tarkista, onko annettu tekstimerkkijono kelvollinen Jälleen kerran, URL-osoitteen tarkistuksen säännölliset lausekkeet voidaan toteuttaa useilla tavoilla.

Ratkaisu. Lopullinen versiomme näyttää tältä:

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

Katsotaanpa nyt sen komponentteja yksityiskohtaisemmin kuvan avulla.

Luottokorttien numeroiden tarkistaminen

Tehtävä. Yleisimmissä maksujärjestelmissä on tarkistettava syötetyn muovikortin numeron oikeellisuus. Vaihtoehto huomioidaan vain korteille

Ratkaisu. Kun luot lauseketta, sinun on otettava huomioon mahdolliset välilyönnit syötetyssä numerossa. Kortin numerot on jaettu ryhmiin lukemisen ja sanelun helpottamiseksi. Siksi on aivan luonnollista, että henkilö saattaa yrittää syöttää numeroa tällä tavalla (eli välilyöntejä käyttäen).

Mahdolliset välilyönnit ja väliviivat huomioon ottavan yleislausekkeen kirjoittaminen on vaikeampaa kuin pelkkä kaikkien merkkien paitsi numeroiden hylkääminen. Siksi on suositeltavaa käyttää lausekkeessa /D-metamerkkiä, joka poistaa kaikki merkit paitsi numerot.

Nyt voit siirtyä suoraan numeron tarkistamiseen. Kaikki luottokorttiyhtiöt käyttävät yksilöllistä numeromuotoa. Esimerkki käyttää tätä, eikä asiakkaan tarvitse syöttää yrityksen nimeä - se määräytyy numeron mukaan. Visa-kortit alkavat aina numerolla 4 ja niiden numeron pituus on 13 tai 16 numeroa. MasterCard alkaa välillä 51-55 numeron pituudella 16. Tuloksena saadaan seuraava lauseke:

Ennen tilauksen käsittelyä voit suorittaa lisätarkistuksen numeron viimeiselle numerolle, joka lasketaan Luhn-algoritmilla.

Puhelinnumeroiden tarkistaminen

Tehtävä. Syötetyn puhelinnumeron oikeellisuuden tarkistaminen.

Ratkaisu. Lanka- ja matkapuhelinnumeroiden numeroiden määrä vaihtelee huomattavasti maittain, joten puhelinnumeron oikeellisuutta ei voida yleisesti tarkistaa säännöllisillä lausekkeilla. Mutta kansainvälisillä numeroilla on tiukka muoto, ja ne sopivat hyvin mallien tarkistamiseen. Lisäksi yhä useammat kansalliset puhelinoperaattorit yrittävät noudattaa yhtä standardia. Numeron rakenne on seuraava:

+CCC.NNNNNNNNNNxEEEE, Jossa:

C on maatunnus, joka koostuu 1-3 numerosta.

N - enintään 14 numeroa pitkä numero.

E - valinnainen laajennus.

Plus on pakollinen elementti, ja x-merkki on läsnä vain, kun laajennus on tarpeen.

Tämän seurauksena meillä on seuraava lauseke:

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

Numerot alueella

Tehtävä. Sinun on vastattava kokonaislukua tietyllä alueella. Lisäksi on välttämätöntä, että säännölliset lausekkeet vastaavat vain lukuja arvoalueelta.

Ratkaisu. Tässä on joitain ilmauksia muutamille yleisimmille tapauksille:

IP-osoitteen löytäminen

Tehtävä. Sinun on määritettävä, onko annettu merkkijono kelvollinen IP-osoite IPv4-muodossa välillä 000.000.000.000-255.255.255.255.

Ratkaisu. Kuten kaikissa PHP:n tehtävissä, säännöllisillä lausekkeilla on monia muunnelmia. Esimerkiksi tämä:

Ilmaisun tarkistus verkossa

Säännöllisten lausekkeiden oikeellisuuden testaus voi olla vaikeaa uusille ohjelmoijille syntaksin monimutkaisuuden vuoksi, joka eroaa "tavallisista" ohjelmointikielistä. Tämän ongelman ratkaisemiseksi on olemassa monia online-ilmaisujen testaajia, joiden avulla on helppo tarkistaa luodun mallin oikeellisuus oikealla tekstillä. Ohjelmoija syöttää lausekkeen ja testattavat tiedot ja näkee välittömästi käsittelytuloksen. Yleensä siellä on myös viiteosio, jossa kuvataan yksityiskohtaisesti yleisimpien ohjelmointikielten säännölliset lausekkeet, esimerkit ja toteutuserot.

Mutta täysin luottaa online-palvelujen tuloksiin ei suositella kaikille PHP:tä käyttäville kehittäjille. Säännöllinen lauseke, joka on kirjoitettu ja testattu henkilökohtaisesti, parantaa taitojasi ja takaa virheiden puuttumisen.

1.6K

Säännölliset lausekkeet (lyhennettynä regex) ovat merkkijonoja, jotka muodostavat hakukuvioita. Niitä käytetään ensisijaisesti merkkijonojen sovituskuvioissa.

Lyhyt historia

  • Kaikki alkoi 1940-1960-luvuilla, jolloin monet älykkäät ihmiset puhuivat säännöllisistä lausekkeista;
  • 1970-luku g/re/p;
  • 1980 Perl ja Henry Spencer;
  • 1997 PCRE (Perl Compatible Regular Expressions). Tästä lähtien säännöllisiksi lausekkeiksi kutsuttujen lausekkeiden nousu alkoi. PCRE tarjoaa kirjastot lähes kaikille kielille.

Säännöllisten lausekkeiden yleinen käyttö PHP:ssä

PHP sisältää kolme päätoimintoa PCRE:n kanssa työskentelyyn - preg_match, preg_match_all ja preg_replace.

Vaatimustenmukaisuuden vertailu

Lauseke palauttaa arvon 1, jos osuma on tehty, 0, jos ei, ja epätosi, jos tapahtuu virhe:

int preg_match (merkkijono $malli, merkkijono $subject [, taulukko &$vastaa [, int $liput = 0 [, int $offset = 0 ]]])

Esimerkki säännöllisestä lausekkeesta, joka palauttaa löydettyjen osumien määrän:

int preg_match_all (merkkijono $malli, merkkijono $aihe [, taulukko &$sopii [, int $liput = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Vaihto

Lauseke palauttaa korvatun merkkijonon tai taulukon ( $aiheen perusteella):

sekoitettu preg_replace (sekoitettu $kuvio, sekalainen $korvaus, sekalainen $aihe [, int $raja = -1 [, int $count ]])

Säännöllisten lausekkeiden yleinen käyttö JavaScriptissä

JavaScriptin säännölliset lausekkeet näyttävät melkein samalta kuin PHP:ssä.

Vaatimustenmukaisuuden vertailu

Palauttaa joukon osumia tai nollaa, jos vastaavia ei löydy:

string.match(RegExp);

Vaihto

Säännöllinen lauseke, joka palauttaa merkkijonon tehdyillä korvauksilla:

string.replace(RegExp, korvaus);

JavaScriptin säännöllisten lausekkeiden ominaisuudet

  • Piste ei koskaan vastaa rivinvaihtoa:
  • Samat menetelmät vastaavuuden ja korvauksen vertailuun säännöllisen lausekkeen avulla kuin ilman niitä.

Säännöllisten lausekkeiden mallien muodostamisen periaatteet

Katsotaanpa esimerkkiä, jossa meidän on löydettävä sähköpostiosoitteita koodikannasta. Tavoitteemme:

Analogiset pistorasiat

Säännölliset lausekkeet koostuvat kahden tyyppisistä merkeistä:

  • erikoismerkit: ? * + () () ^ $ / .
  • Literaalit.

Ajattele syöttöjonoja pultteina ja mallia niiden liittimien sarjana (oikeassa järjestyksessä).

Erikoishahmot

Kun testaat säännöllisiä lausekkeita, sinun on tiedettävä, miten erikoismerkit toimivat:

  • Kenoviivamerkki \ voi korvata toisen erikoismerkin säännöllisessä lausekkeessa:
  • Piste ja w - .

Vastaa kaikki merkit paitsi rivinvaihto. Jos haluat tarkistaa pisteen ja vain pisteen - , kirjainten, numeroiden ja alaviivojen noudattamisen - w

  • Hakasulkeet.

Yhdistä sulkeissa olevat merkit. Tukee alueita. Muutamia esimerkkejä:
o - vastaa mitä tahansa a, b tai c.
o isot kirjaimet.
o mikä tahansa numero.
o - Vastaa mitä tahansa pieniä tai isoja kirjaimia.
Valinnainen? Ottelu 0 tai 1.
Tähti *.

Asteriski tarkoittaa 0 tai useampaa merkkiä.

Yhdistä 1 tai useampi merkki.

Kiharat olkaimet ().

Minimi- ja maksimiarvot. Joitakin esimerkkejä säännöllisen lausekkeen syntaksista:
o (1,) vähintään 1.
o (1,3) 1 - 3.
o (1,64) 1 - 64.

Lisätään tämä kaikki saadaksesi säännöllisen lausekkeen sähköpostiosoitteille:

/+@+(.+)*/i


Tältä se näyttää PHP:ssä:

preg_match_all("/+@+(.+)*/i", $syöttörivit, $tulostusjono);

Säännöllisen lausekkeen käyttäminen vahvistamiseen

Haaste: Varmista, että syöttötiedot ovat sitä, mitä odotamme. Tavoite 1: /[^w$.]/ Tavoite 2: /^(1,2)$/

Säännölliset lausekkeet sopivat elementtien löytämiseen, mutta sinun on tiedettävä, mitä tarkalleen etsit.

Milloin säännöllistä lauseketta ei pitäisi käyttää validointiin?

Monet tapaukset voidaan käsitellä paremmin PHP filter_var -funktiolla. Esimerkiksi sähköpostiosoitteen vahvistus tulisi tehdä PHP:n sisäänrakennetuilla suodattimilla:

filter_var(" [sähköposti suojattu]", FILTER_VALIDATE_EMAIL)

Vahvistus säännöllisillä lausekkeilla

Säännölliset lausekkeet rivin lopussa käyttävät ankkureita:

^ - osoittaa rivin alun.
$ on dollarimerkki, joka osoittaa rivin lopun.

if (!preg_match("%^(1,2)$%", $_POST["tilaustaajuus"])) ( $isError = true; )

Poissuljetut hahmoluokat

[^abc] - kaikki paitsi a, b tai c, mukaan lukien rivinvaihdot.

Esimerkki, jonka avulla voit syöttää vain aakkosnumeerisia merkkejä, väliviivoja, pisteitä ja alaviivoja:

if (preg_match("/[^0-9a-z-_.]/i", $tuotekoodi)) ( $isError = true; )

Etsi ja vaihda

Yleisimmät PCRE-funktiot etsi- ja korvaamiseen ovat preg_replace() ja preg_replace_callback() . Mutta on myös preg_filter() ja preg_replace_callback_array(), jotka tekevät melkein saman asian. Huomaa, että preg_replace_callback_array()-funktio on ollut saatavilla PHP7:stä lähtien.

Korvaa sanat luettelossa

$subject = "Haluan syödä omenoita."; echo preg_replace("/omena|banaani|appelsiini/", "hedelmä", $aihe);

Tulos

Haluan syödä hedelmiä.

Jos säännöllisessä lausekkeessa on alikuvioita ( suluissa), voit korvata $N tai N (missä N on kokonaisluku >= 1), tätä kutsutaan "käänteiseksi linkiksi".

Kahden numeron järjesteleminen uudelleen

$aihe = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $aihe);

Tulos

Muuta päivämäärän muotoilua

$aihe = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $aihe);

Tulos

Yksinkertainen esimerkki URL-osoitteen korvaamisesta tagissa

$subject = "Siirry https://php.earth/doc saadaksesi lisää artikkeleita."; echo preg_replace("#(https?://([^s./]+(?:[^s./]+)*[^s]*))#i", "$2", $aihe) ;

Tulos

PHP regexp on tehokas kuvioiden täsmäytysalgoritmi, joka voidaan tehdä yhdellä lausekkeella. PHP:n säännölliset lausekkeet käyttävät aritmeettisia operaattoreita (kuten +, -, ^) monimutkaisten lausekkeiden luomiseen.

Mihin säännöllisiä lausekkeita käytetään:

  • Säännöllisten lausekkeiden avulla on helppo tunnistaa merkkijonotiedot kutsumalla yhtä funktiota. Tämä säästää aikaa koodia kirjoitettaessa;
  • Kun tarkistetaan käyttäjän syöttämiä tietoja, kuten sähköpostiosoite, verkkosivuston verkkotunnus, puhelinnumero, IP-osoite;
  • Avainsanojen korostaminen hakutuloksissa;
  • Säännöllisiä lausekkeita voidaan käyttää tunnisteiden tunnistamiseen ja korvaamiseen.

Säännölliset lausekkeet PHP:ssä

PHP sisältää sisäänrakennettuja toimintoja, joiden avulla voit työskennellä säännöllisten lausekkeiden kanssa. Katsotaan nyt yleisesti käytettyjä PHP:n säännöllisiä lausekkeita.

  • preg_match - Käytetään merkkijonomallin sovittamiseen. Se palauttaa tosi, jos vastaavuus löytyy, ja epätosi, jos vastaavuutta ei löydy.
  • preg_split - käytetään jakamaan merkkijono kaavan mukaan, tulos palautetaan numeerisena taulukkona;
  • preg_replace – käytetään mallin etsimiseen ja korvaamiseen määritetyllä merkkijonolla.

Alla on syntaksi säännöllisille lausekefunktioille, kuten preg_match, preg_split tai PHP regexp korvaa:

"funktion_nimi" on joko preg_match, preg_split tai preg_replace.
"/…/" - kauttaviivat osoittavat säännöllisen lausekkeen alun ja lopun.
"'/pattern/"" on kuvio, joka meidän on yhdistettävä.
"objekti" on merkkijono, joka vastaa kuviota.

Katsotaan nyt käytännön esimerkkejä yllä mainittujen toimintojen käytöstä.

Preg_match

Ensimmäinen esimerkki käyttää preg_match-funktiota yksinkertaisen mallihaun suorittamiseen annetussa URL-osoitteessa olevalle sanalle guru.

Alla oleva koodi näyttää tämän esimerkin toteutuksen:


Katsotaanpa sitä koodin osaa, joka vastaa ulostulosta "preg_match('/guru/', $oma_url)".

"preg_match(…)" on PHP-sovituksen regexp-funktio.
"'/Guru/"" on säännöllinen lausekemalli.
"$My_url" on muuttuja, joka sisältää tekstin, joka vastaa kuviota.

Preg_split

Katsotaanpa toista esimerkkiä, joka käyttää preg_split-funktiota.

Otamme lauseen ja jaamme sen taulukkoon; kuvio on suunniteltu sopimaan yhteen tilaan:

Preg_replace

Harkitse preg_replace-funktiota, joka suorittaa kuvion vastaavuuden ja korvaa vastaavan tuloksen toisella merkkijonolla.

Alla oleva koodi etsii sanaa guru merkkijonosta. Hän korvaa sen css-koodilla, joka asettaa taustavärin:

Guru", $teksti); echo $teksti; ?>

Metahahmot

Yllä olevissa esimerkeissä käytettiin yksinkertaisia ​​malleja. Metamerkit mahdollistavat monimutkaisemman PHP:n regexp-kuvion täsmäytyksen, kuten sähköpostiosoitteen vahvistuksen. Katsotaanpa yleisesti käytettyjä metamerkkejä.

Metahahmo Kuvaus Esimerkki
. Vastaa mitä tahansa muuta yksittäistä merkkiä kuin rivinvaihtomerkkiä. /./ - kaikki, joka sisältää yhden merkin.
^ Merkitsee rivin alun, pois lukien /-merkki. /^PH/ on mikä tahansa merkkijono, joka alkaa PH:lla.
$ Osoittaa kuvion rivin lopussa. /com$/ - guru99.com, yahoo.com jne.
* Ilmaisee minkä tahansa merkkimäärän, nolla tai enemmän. /com*/ - tietokone, viestintä jne.
+ Vaatii, että merkki(t) esiintyy ennen metamerkkiä vähintään kerran. /yah+oo/ - yahoo.
Pako-symboli. /yahoo+.com/ - ottaa pisteen kirjaimellisena merkityksenä.
[…] Hahmoluokka. // - abc.
a-z Osoittaa pieniä kirjaimia. /a-z/ - siistiä, iloista jne.
A-Z Osoittaa isot kirjaimet. /A-Z/ - MITÄ, MITEN, MIKSI jne.
0-9 Edustaa mitä tahansa numeroita 0-9. /0-4/ — 0,1,2,3,4.

Katsotaanpa nyt monimutkaista PHP regexp -esimerkkiä, joka tarkistaa sähköpostiosoitteen oikeellisuuden:

Tulos: sähköpostiosoite [sähköposti suojattu] on voimassa.

Kaavan "+@+.(2.5)$/] selitys

"/…/" aloittaa ja päättää säännöllisen lausekkeen.
"^" vastaa mitä tahansa pieniä tai isoja kirjaimia, numeroita 0–9 sekä pisteitä, alaviivoja tai väliviivoja.
"+@" vastaa @-symbolia, jota seuraa pieniä tai isoja kirjaimia, numeroita 0–9 tai yhdysmerkkejä.
"+.(2,5)$/" määrittää pisteen kenoviivalla, jota seuraa kaikki pienet tai isot kirjaimet. Merkkien lukumäärän rivin lopussa on oltava välillä 2-5.