Príklady fungovania regulárnych výrazov v php. Regulárne výrazy v php

  • 02.08.2019

Začnime tým, čo je regulárny výraz. Tu je odpoveď na moju otázku, je v slove "test" písmeno "e"? "Existuje!" ty hovoríš. Potom vám položím druhú otázku, ako ste našli písmeno „e“ v slove „test“? Odpoveď je zrejmá, vezmeme prvý znak, teda „t“ a porovnáme ho s tým, čo hľadáme, teda s „e“. Ak sa nerovnajú, tak vezmeme druhý znak, teda „e“, porovnáme ho s tým, čo hľadáme, teda „e“. Voila! Našla sa zhoda. Odpoveď: Slovo "test" obsahuje písmeno "e".

Teraz mi odpovedzte ešte na jednu otázku, kde je regulárny výraz v tomto príklade? Dúfam, že ste uhádli, že regulárny výraz je to, čo hľadáme v slove „test“. To znamená, že písmeno "e" v tomto príklade je regulárny výraz.

Na čo sa v php používajú regulárne výrazy? V mojej praxi sa regulárne výrazy používali napríklad na zistenie, či je e-mailová adresa v správnom tvare. Takéto výrazy sa používajú aj na určenie správnosti používateľského mena a hesla. Pomocou regulárnych výrazov môžete nájsť adresu v odkaze a uložiť ju. Veľa vecí, ktoré môžete urobiť Analýzou tohto môžete identifikovať hlavnú funkciu regulárnych výrazov a dve vedľajšie. Hlavná funkcia, ide o vyhľadávanie zhôd v reťazci. Vedľajšie účinky sú ukladanie nájdených zhôd a ich nahradenie.

Prvý regulárny výraz

Teoreticky chápeme, ako nájsť symbol „e“ v slove „test“, ako sa to realizuje v praxi? Na použitie regulárnych výrazov v php sa zvyčajne používajú tieto funkcie:

preg_match ("regulárny výraz (vzor)", "premenná, v ktorej sa vyhľadávanie vykonáva", "premenná, v ktorej je uložený výsledok vyhľadávania (voliteľný parameter)"); - Funkcia zhody
preg_replace ("regulárny výraz (vzor)", "Čím nahradiť nájdenú zhodu", "premenná, do ktorej sa má nahradiť"); - Funkcia výmeny

Začnime používať tieto funkcie .. Tu je príklad nájdenia znaku „e“ v slove „test“:

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

Kód popisuje stav, ak sa niečo nájde v premennej $ a podľa vzoru, potom sa zobrazí správa "nájdené!!" Ako vidíte, náš vzor je medzi dvoma "/". V tomto prípade "/" symbolizuje začiatok a koniec našej šablóny... Dúfam, že je to jasné.

To všetko je samozrejme zaujímavé ... ale to je len naša šablóna, ktorá je veľmi jednoduchá, nemyslíte? Málokedy totiž potrebujeme nájsť nejaký symbol v premennej. Vo väčšine prípadov musíme nájsť veľa symbolov, navyše neznámych. Ako byť? Stanovme si problém a skúsme ho vyriešiť. Predpokladajme, že máme reťazec pozostávajúci z čísel a jedného neznámeho anglického písmena

Ako nájdete tento list? Môže existovať akékoľvek písmeno anglickej abecedy, ako ho môžete definovať? Sami ste si odpovedali na svoju otázku, existuje nejaké písmeno, to znamená, že je v rozsahu od a po z. Rozsahy možno použiť v regulárnych výrazoch. Ak nevieme, aký znak hľadáme, ale s istotou vieme, že tento znak je písmenom anglickej abecedy, záznam bude nasledovný:

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

Všimnite si, že rozsah je uzavretý v zátvorkách "[" "]". Všetko, čo je uzavreté v takýchto zátvorkách, je definované ako jeden znak, v tomto prípade sa znak pohybuje od a do z. Ak potrebujeme nájsť nie písmeno, ale číslo, záznam bude takýto:

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

Chcem tiež poznamenať, že regulárne výrazy rozlišujú veľké a malé písmená, takže znaky „A“ a „a“ sú úplne odlišné, pri hľadaní tých a tých znakov píšu takto:

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

Existuje aj vyhľadávanie ruských písmen, ktoré sa vykonáva rovnakým spôsobom ako v angličtine:

$ a = "123ы321";
if (preg_match ("/ [a-za-z] /", $ a)) echo "found !!";

Metaznaky

Naučili sme sa hľadať neznámy znak v reťazci. Čo ak potrebujeme nájsť niekoľko symbolov? Na pomoc prichádzajú takzvané metaznaky ... Predpokladajme, že máme reťazec s číslami, písmenami, ako to opísať v šablóne? Dokážeš to:

reťazec - 123а321
vzorka -

Hmm ... šablóna sa skutočne zhoduje s naším reťazcom a keď sa skontroluje, či je v súlade, splní dlho očakávanú skutočnosť! Ale nejaké ťažkopádne nahrávanie, nemyslíte?

Takto ho môžete skrátiť:

reťazec - 123а321
vzorka - *

Zdá sa mi to také kratšie Aký je symbol "*"? Toto je samotný metaznak, to znamená, že znak, ktorý sme opísali (a to znak, ktorý môže obsahovať čísla od 0 do 9 alebo písmená anglickej abecedy od a po z) sa môže opakovať donekonečna alebo viackrát. Áno áno! Tento metaznak sa bude zhodovať v prázdnej premennej, pretože aj absencia symbolu, ktorý sme opísali, vráti hodnotu true! Zapamätaj si to

Aké ďalšie metaznaky existujú?

Napríklad metaznak "+" Je takmer podobný metaznaku "*" s jednou malou výnimkou. "*" vráti hodnotu true, aj keď tam nie je žiadny znak, a "+" skontroluje prítomnosť aspoň jedného znaku. To znamená, ak reťazec vyžaduje prítomnosť minimálne jeden znak, potom použite "+" namiesto "*"

Metaznak "?" To znamená, že reťazec by nemal obsahovať viac ako jeden požadovaný znak. Dovoľte mi uviesť niekoľko príkladov pre posledné dva metaznaky, ktoré som opísal.

Predpokladajme, že musíme skontrolovať správnosť hesla používateľa. Zamyslime sa nad tým, čo by malo obsahovať heslo používateľa? Po prvé, musí to byť aspoň jeden znak. Po druhé, mal by obsahovať iba čísla a písmená anglickej abecedy, takže regulárny výraz bude vyzerať takto:

$ a = "qwerty12345";

Aké znaky sme povolili? Anglické písmená akéhokoľvek registra a čísla. Teraz skúste namiesto hesla nechať prázdny riadok.

$ a = "";
if (preg_match ("/ + /", $ a)) echo "Heslo je správne";

Neuvidíte správu „Heslo je správne“. prečo? Pretože metaznak "+" skontroloval reťazec na prítomnosť aspoň jedného znaku.

A teraz malý trik, pozrime sa na náš výraz, nedali sme v ňom povedzme priestor, však? dajte na koniec hesla medzeru a spustite

$ a = "qwerty12345";
if (preg_match ("/ + /", $ a)) echo "Heslo je správne";

A prečo sa nám zobrazuje naša správa o správnom hesle? Celkom jednoduché ... funkcia preg_match (); zastaví svoju kontrolu pri prvom zápase. To znamená, že znak „q“ sa zhoduje s nami opísaným vzorom a všetko ostatné už nie je pre funkciu dôležité.Tak čo robiť? Tu je postup, ako to opraviť:

$ a = "qwerty12345";
if (preg_match ("/ ^ + $ /", $ a)) echo "Heslo je správne";

Pridaním „^“ na začiatok výrazu a „$“ na koniec povieme funkcii, aby sa zhodovala so vzorom. všetky riadok. Ak spustíte tento kód, správu neuvidíte, pretože koniec hesla obsahuje neplatný znak - medzeru

Teraz zmeňte metaznak "+" na "?" Čo si myslíte, že sa stane? Správna správa o správnosti hesla nebude chýbať, pretože heslo obsahuje viac ako jeden znak. Dúfam, že som správne vysvetlil, ako tieto tri bežne používané metaznaky fungujú.

Niekedy je lepšie „nie“.

Aspoň sme sa naučili kontrolovať správnosť hesla a to je dobre! Poviem vám o ďalšom spôsobe, ako nájsť niečo v reťazci. Povedzme, že potrebujeme skontrolovať absenciu čísel v reťazci. Ako to spraviť? Tu je riadok:

(Úmyselne som do nej vložil tieto symboly "-_ + ()", aby sa život nezdal ako med ...) Mohli by sme zostaviť nasledujúci výraz:

Ale musíte súhlasiť, pretože nie vždy vieme, aké znaky sú v reťazci použité, ale s istotou vieme, že by v ňom nemali byť čísla! Preto by bolo logickejšie jednoducho napísať šablónu, ktorá by preskakovala riadky, v ktorých niečíslic, a nie tých, v ktorých je "Ach môj bože, koľko nepochopiteľných symbolov!!!"... Tu je príklad správne vytvoreného výrazu pre takéto úlohy:

$ a = "a -_ + ()";
if (preg_match ("/ ^ [^ 0-9] + $ /", $ a)) echo "Žiadne čísla!";

Ako sme to dosiahli? Zaviedli sme symbol ale!čiapočka "^" ([^ 0-9]) umiestnená na začiatku znamená, že riadok tohto znaku obsahuje nemal by Dúfam, že sme na to prišli

No, poďme to trochu zhrnúť ... uvediem dva príklady s vysvetlivkami, pri ktorých sa naučíme uložiť výsledok vyhľadávania do premennej a naučíme sa kontrolovať správnosť poštovej adresy

Videl som to, zachránil som to!

Môj blog

$ a = " Môj blog";
preg_match ("/ / ", $ a);

V našom regulárnom výraze sme opísali všetky možné znaky, ktoré je možné zahrnúť do odkazu. Ešte chcem upozorniť na úvodzovky a znaky "/" v našom výraze .. Pred nimi je spätná lomka, načo to je? Ide o to, že „/“ a úvodzovky sú samy osebe špeciálne znaky. A aby ich šablóna vnímala ako obyčajné symboly, musíme ich skrínovať. Skríning sa vykonáva pridaním spätnej lomky pred špeciálne znaky. Dúfam, že je to jasné

$ a = " Môj blog";
preg_match ("/ / ", $ a, $ b);

No a podľa toho musíte pridať ďalší parameter vo forme premennej $ b, do ktorej sa nájde nájdený odkaz. Musíte tiež vedieť, že výsledok vyhľadávania je umiestnený v poli. Takže premenná $ b je pole. Informácie, ktoré hľadáme, sú pod indexom 1. To znamená, že výsledok vyhľadávania je v premennej $ b. výsledok zobrazíme na obrazovke:

$ a = " Môj blog";
preg_match ("/ / ", $ a, $ b);
echo $ b;

Správna adresa je kľúčom k úspechu!

No a na ďalší krok, odpoveď na otázku, je e-mail správny? Najprv musíte vedieť, aké znaky sú povolené v adresách? Pokiaľ viem, povolené znaky zahŕňajú:

  • Anglické písmená, číslice, "_", "-" emmmm ako všetko ... Poďme z toho.
  • Ďalej máme „@“
  • Potom anglické písmená
  • Ďalej pointa
  • A opäť anglické písmená ...

Takže regulárny výraz bude vyzerať takto:

$ a = " [e-mail chránený]";
if (preg_match ("/ ^ [e-mail chránený]+. + $ / ", $ a)) echo" E-mailová adresa je správna! ";
else echo "E-mailová adresa NIE JE správna!";

Nuž ... dúfam, že vás takéto záznamy teraz nevystrašia a celkom im rozumiete.

V nadväznosti na to chcem niečo povedať. Článok sa ukázal ako ťažkopádny a zároveň pokrýval len časť možností. Ak čítate túto vetu, tak ste ju s najväčšou pravdepodobnosťou dočítali až do konca, za čo vám veľmi pekne ďakujem

Čo sa týka cyklu článkov o rozvoji cms blogu, prvá časť cyklu Oznamujem zatvorene! V dohľadnej dobe začneme implementovať admin panel, takže „neprepínajte“ Ak máte nejaké otázky, rád odpoviem. Všetko najlepšie pre teba, mám všetko!


Jednou z veľmi výkonných a užitočných funkcií jazyka PHP je podpora regulárnych výrazov. Mnoho programátorov, začiatočníkov aj pomerne skúsených, je vystrašených vonkajšou zložitosťou a zmätenosťou jazyka regulárnych výrazov. Ale môžem vás ubezpečiť - stojí to za to. Používanie regulárnych výrazov výrazne uľahčuje prácu pri spracovaní textu a zle štruktúrovaných údajov.


Regulárne výrazy sú výrazy napísané v špeciálnom jazyku. Nezľaknite sa, jazyk je dostatočne jednoduchý na pochopenie, sú potrebné len skúsenosti a prax.


Myslím, že ste sa opakovane stretli so situáciami, keď máte text (napríklad v programe Microsoft Word) a potrebujete v ňom nájsť niečo dôležité. Ak viete, čo presne hľadáte, všetko je jednoduché: vyvolali dialógové okno vyhľadávania, zadali požadované slovo, stlačili tlačidlo a voila - text sa našiel.


Čo však robiť, ak vopred poznáte len typ informácií, ktoré hľadáte? Vašou úlohou je napríklad nájsť všetky e-mailové adresy v niekoľkých stovkách listov dokumentu. Niektorí budú listovať v dokumente manuálne, niektorí budú hľadať psa (@) a hľadať ho. Súhlasím - oba varianty sú tvrdá práca, nevďačná práca.

Tu prichádzajú na pomoc regulárne výrazy. V určitej aproximácii možno regulárne výrazy porovnať s maskami alebo vzormi, ktoré sú prekryté textom: ak sa text zhoduje s maskou, potom je to požadovaný fragment. Predtým, ako sa však pozrieme na použitie regulárnych výrazov, pozrime sa na ich syntax.

Regulárny výraz je textový reťazec zložený podľa určitých zákonov a pravidiel. Reťazec pozostáva zo znakov a skupín znakov, metaznakov, kvantifikátorov a modifikátorov.

V tomto prípade sú symboly akékoľvek symboly akejkoľvek abecedy. A nielen tie čitateľné. Do výrazu môžete jednoducho vložiť nečitateľný znak, na to vám stačí poznať jeho kód v hexadecimálnom tvare. Napríklad:

// čitateľné znaky a Е // nečitateľné znaky a kódy \ x41 - to isté ako písmeno "A" \ x09 - tabuľkový znak

Skupina znakov je séria znakov napísaných v poradí:

Abvg ACZms

Hneď dávam do pozornosti - za významný znak sa považuje aj "medzera" v regulárnych výrazoch, takže pri písaní výrazov buďte opatrní. Napríklad tieto znaky grappa sú RÔZNE výrazy:

ABVGDE ABC KDE

Ďalším jazykovým prvkom sú metaznaky. Predpona „meta“ znamená, že tieto symboly opisujú niektoré ďalšie symboly alebo ich skupiny. V tabuľke sú uvedené hlavné metaznaky jazyka regulárnych výrazov:

Metaznaky na špecifikovanie špeciálnych znakov
() Zátvorky. Definujte vnorené výrazy.
| Výberový metaznak
^ Začiatok riadku metaznak
$ Metaznak konca riadku
\ n Riadkový znak (hex 0x0A)
\ r Vrátenie vozíka (hex 0x0D)
\ t Znak tabulátora (hexadecimálne 0x09)
\ xhh Vložte znak s hexadecimálnym kódom 0xhh, napríklad \ x42 vloží latinské písmeno "B"
Metaznaky na špecifikovanie skupín znakov
. Bod. Akýkoľvek charakter.
\ d Číslice (0-9)
\ D Nie je to číslica (akýkoľvek znak okrem znakov 0-9)
\ s Prázdny znak (zvyčajne medzera a znak tabulátora)
\ S Neprázdny znak (všetko okrem znakov definovaných metaznakom \ s)
\ w Znak zo „slovníka“ (znak, ktorý sa používa v slovách. Zvyčajne všetky písmená, všetky čísla a podčiarkovník („_“))
\ W Všetko okrem znakov určených metaznakom \ w

Metaznaky z druhej polovice tabuľky sú veľmi ľahko zapamätateľné. "d" je číslica (číslica), "s" je symbol (symbol), "w" je slovo (slovo). Ak je písmeno veľké, musíte do popisu skupiny pridať „NIE“.

Vezmime si napríklad text „Červený dres má čísla 1812 a zelený dres je 2009“. Pozrime sa na príklady najjednoduchších regulárnych výrazov:

\ d \ d \ d \ d - nájde 1812 a 2009 \ D - nájde všetky písmená, medzery a interpunkčné znamienka \ s - nájde všetky medzery v texte.

Ale koniec koncov, rok v našom príklade možno písať nie štyrmi, ale dvoma číslami, slová môžu mať iné skloňovanie atď. Tu môžu pomôcť podmnožiny znakov, ktoré sú špecifikované pomocou hranatých zátvoriek:

Znamená ľubovoľnú číslicu (rovnako ako \ d) - znamená párnu číslicu - označuje akýkoľvek znak latinskej abecedy (v každom prípade) alebo číslicu.

Napríklad výraz \ d \ d \ d v testovacom riadku nájde iba 1812, ale nie 2009. Tento výraz by sa mal čítať ako „nájdi všetky štvorciferné sekvencie, kde posledná číslica je 0,2,4,6 alebo 8".

Musíme spomenúť len kvantifikátory a modifikátory.

Kvantifikátor je špeciálna konštrukcia, ktorá určuje, koľkokrát sa má postava alebo skupina postáv objaviť. Kvantifikátor je uzavretý v zložených zátvorkách "()". Existujú dva formáty záznamu: presný a rozsah. Presné formát je napísaný takto:

X je počet, koľkokrát sa musí predchádzajúci znak alebo skupina zopakovať. Napríklad výraz

Druhou formou zápisu je rozsah. Napísané ako

(X, Y) // alebo (, Y) // alebo (X,)

kde X je minimum a Y je maximálny počet opakovaní. Napríklad:

znie ako „dve až štyri po sebe idúce číslice“. Ak jedna z hraníc nie je špecifikovaná, znamená to absenciu obmedzenia. Napríklad:

\ w (3,) - tri alebo viac písmen. \ d (, 5) - neexistujú žiadne číslice alebo sú tam číslice, ale nie viac ako päť.

Kvantifikátory možno použiť buď na jeden znak, alebo na skupinu:

[A-Ya-me] (1,3)

Táto konštrukcia vyberie z textu všetky ruské slová s jedným, dvoma alebo tromi písmenami (napríklad "alebo", "nie", "ja", "idem" atď.)

Okrem zložených zátvoriek c existujú tri ďalšie kvantifikátory metaznakov: "*" (hviezdička), "+" (plus) a "?" (otázka). Používajú sa v prípadoch, keď nie je vopred známy minimálny a maximálny počet požadovaných opakovaní. Napríklad pri vyhľadávaní e-mailových adries nemôžete vopred určiť, koľko znakov bude v používateľskom mene (pred „pes“) a koľko v názve domény (po „pes“).

Metaznak "*" sa číta ako "akékoľvek číslo od nuly alebo viac", t.j. dizajn

definuje ľubovoľný počet po sebe nasledujúcich písmen vrátane ich úplnej absencie.

Symbol „+“ sa od hviezdičky líši len tým, že vyžaduje aspoň jeden symbol. Tie. dizajn

zhoduje sa s akoukoľvek číselnou sekvenciou, kde je jedna alebo viac číslic.

Symbol "?" zodpovedá absencii alebo prítomnosti jedného znaku. Tie. dizajn

zhoduje sa s akoukoľvek číselnou sekvenciou, kde je jedna alebo dve číslice.

Tu stojí za zmienku taká vlastnosť antifierov "*" a "+" ako chamtivosť... Pointa je, že štandardne sa tieto znaky zhodujú s najdlhším možným sledom znakov. Napríklad pre riadok „Mama umývala rám“ výraz:

vyberie "mama soap ra", čo je trochu nečakané, pretože sme mali dostať "ma". Ak chcete zmeniť toto správanie, použite znak "?" (otáznik), napísaný bezprostredne za kvantifikátorom. Dusí apetít kvantifikátorov tým, že ich núti vrátiť prvý zápas, nie ten najdlhší. Teraz zmeníme predchádzajúci príklad:

a dostaneme požadovanú zhodu "ma".

Posledným prvkom jazyka je modifikátory... Modifikátor je špeciálny znak, ktorý definuje "systémové" parametre analýzy regulárneho výrazu. Existujú iba štyri takéto symboly, možno ich použiť jednotlivo aj súčasne:

i Zapne režim bez rozlišovania malých a veľkých písmen, t.j. veľké a malé písmená sa vo výraze nelíšia.
m Označuje, že vyhľadávaný text by sa mal považovať za viacero riadkov. V predvolenom nastavení modul regulárneho výrazu zaobchádza s textom ako s jedným reťazcom bez ohľadu na to, aký v skutočnosti je. Preto metaznaky "^" a "$" označujú začiatok a koniec celého textu. Ak je zadaný tento modifikátor, budú ukazovať na začiatok a koniec každého riadku textu.
s Predvolený metaznak je "." nezahŕňa vo svojej definícii znak pre posun riadkov. Tie. pre viacriadkový text vráti výraz /.+/ iba prvý riadok, nie celý text, ako sa očakávalo. Zadaním tohto modifikátora sa toto obmedzenie odstráni.
U V predvolenom nastavení sú všetky metaznaky nenásytné. V niektorých modifikáciách jazyka (najmä v PHP) sa namiesto "U" používa znak "g", ktorý je pre tento význam vhodnejší ("g" je skratka pre anglické "greedy", "greedy" ).

V tabuľke sú uvedené najpopulárnejšie a najužitočnejšie príklady regulárnych výrazov. Niektoré sa vám môžu zdať komplikované a ťažkopádne, no pri podrobnom štúdiu na to nepochybne prídete.

Regulárne výrazy v PHP.

Na prácu s regulárnymi výrazmi v PHP existujú špeciálne funkcie, ktorých zoznam a stručný popis sú uvedené v tabuľke:

int preg_match (vzor reťazca, predmet reťazca [, zhody poľa])

Funkcia kontroluje, či sa obsah predmetu zhoduje so vzorom. Ak sa nájdu zhody, vráti 1, v opačnom prípade vráti 0. Ak zadáte voliteľný parameter poľa, zhody, po vykonaní funkcie sa k nej pridá jeden prvok – prvá nájdená zhoda.

"; print_r ($ nájdené);?>

int preg_match_all (vzor reťazca, predmet reťazca, zhody poľa [, int order])
Funkcia je totožná s predchádzajúcou, len s tým rozdielom – prehľadá celý text a vráti VŠETKY nájdené zhody v poli matchs.
zmiešaná preg_replace (zmiešaný vzor, ​​zmiešaná náhrada, zmiešaný predmet [, int limit])
Rovnako ako obe predchádzajúce funkcie, aj preg_replace hľadá časť textu, ktorá sa zhoduje so vzorom. Funkcia nahradí všetky nájdené fragmenty textom špecifikovaným v parametroch.Pred čistením:\ n $ text \ n \ n "; $ text = preg_replace (" / (\ n \ s (2,)) / "," ", $ text); echo" Po vyčistení:\ n $ text "; // zobrazí text zbavený špeciálnych znakov // a medzier navyše?>
zmiešané preg_replace_callback (zmiešaný vzor, ​​zmiešané spätné volanie, zmiešaný predmet [, int limit])
Funkcia je rozšírenou verziou predchádzajúcej. Hlavný rozdiel je v tom, že názov funkcie, ktorá bude analyzovať text a vytvárať alternatívny text, je odovzdaný tejto funkcii v parametroch.
pole preg_split (vzor reťazca, predmet reťazca [, limit int [, príznaky int]])
Táto funkcia je podobná funkciám rozložiť () a rozdeliť (). Jeho zvláštnosťou je, že oddeľovač nie je pevný reťazec, ale regulárny výraz. Funkcia rozdelí pôvodné údaje na prvky a umiestni ich do výstupného poľa.
pole preg_grep (vzor reťazca, vstup poľa)
Funkcia je určená na bežné vyhľadávanie v poliach. Pre vyhľadávanie sa zadá šablóna a pole vstupných údajov a vráti sa pole pozostávajúce iba z prvkov, ktoré zodpovedajú šablóne.

Uvedený zoznam funkcií nie je ani zďaleka úplný, no na úspešné začatie práce s regulárnymi výrazmi úplne postačuje. Ak vás táto téma zaujíma, určite si prečítajte doplnkovú literatúru (napríklad Friedlovu knihu „Regulárne výrazy“). Okrem toho pre účely školenia odporúčam nainštalovať niektorý zo špeciálnych programov na testovanie regulárnych výrazov (napríklad „PCRE“ alebo „RegEx Builder“).

Najbežnejšie použitie regulárnych výrazov v Perle je pri vyhľadávaní a nahrádzaní operátorov ako napr s //, m /, prevádzkovateľov zväzku =~ alebo != atď. Všetci títo operátori majú spravidla podobné možnosti, ako napríklad:

Tieto možnosti sa zvyčajne označujú ako "/ x". Môžu byť použité aj vo vnútri šablón pomocou novej konštrukcie (? ...)

Regulárne výrazy alebo vzory sú rovnaké ako procedúry regulárneho výrazu Unix. Výrazy a syntax sú požičané z Henryho Spencera V8 Free Ruutines a sú tam podrobne uvedené.

Šablóny používajú nasledujúce metaznaky (znaky reprezentujúce skupiny iných znakov), často označované ako egrep štandard:

Metaznaky majú modifikátory (písané za metaznakom):

Vo všetkých ostatných prípadoch sa zložené zátvorky považujú za bežné (bežné) znaky. Takže "*" je ekvivalentné s (0,), "+" - (1,) a "?" - (0,1). n a m nemôžu byť väčšie ako 65536.

V predvolenom nastavení sú metaznaky nenásytné. Zápas sa propaguje toľkokrát, koľkokrát je to možné, bez ohľadu na účinok nasledujúcich metaznakov. Ak chcete „znížiť ich chuť do jedla“, použite symbol „?“. To nič nemení na význame metaznakov, len to znižuje šírenie. takto:

Vzory fungujú rovnako ako dvojité úvodzovky, takže v nich môžete použiť znaky `\` - (znaky spätnej lomky):

\ t - znak tabulátora
\ n - Nový riadok
\ r - návrat vozňa
\a - formátový preklad
\ v - vertikálna záložka
\ a - volať
\ e - utiecť
\033 - osmičkový zápis znaku
\ x1A - hexadecimálny
\ c [ - riadiaci charakter
\ l - malé písmeno nasledujúceho znaku
\ u - veľké písmená -//-
\ L - všetky malé písmená až po \ E
\ U - na vrchu - // -
\ E - obmedzovač zmeny registra
\ Q - zrušenie akcie ako metaznaku

Okrem toho boli do Perlu pridané nasledujúce metaznaky:

Všimnite si, že toto všetko je „jeden“ znak. Na označenie poradia použite modifikátory. Takže:

Okrem toho existujú pomyselné metaznaky. Označenie neexistujúcich znakov v bode, kde sa hodnota zmenila. Ako napríklad:

Hranica slova (\ b) je pomyselný bod medzi znakmi \ w a \ W. V rámci triedy znakov "\ b" označuje znak backspace. Metaznaky \ A a \ Z- podobne ako "^" a "$", ale ak začiatok riadku "^" a koniec riadku "$" sú platné pre každý riadok vo viacriadkovom riadku, potom \ A a \ Z označujú začiatok a koniec celého viacriadkového reťazca.

Ak sa vo vzore použije zoskupenie (zátvorky), číslo podreťazca skupiny sa označí ako "\ číslica". Všimnite si, že za vzorom vo výraze alebo bloku sa tieto skupiny označujú ako „číslica $“. Okrem toho existujú ďalšie premenné:

Príklad:

$ s = "Jeden 1 Dva 2 a Tri 3"; if ($ s = ~ / (\ d +) \ D + (\ d +) /) (tlač "$ 1 \ n"; # Výsledok "1" tlač "$ 2 \ n"; # "2" tlač " $ + \ n" ; # "2" tlač "$ & \ n"; # "1 dva 2" tlač "$` \ n "; #" Jeden "tlač" $ "\ n"; # "a tri 3" )

Perl verzia 5 obsahuje ďalšie konštrukcie šablón:

Príklad:

$ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (? = -) /) # Nájdite číslicu nasledovanú "-" (vytlačte "$ 1 \ n"; # Výsledok "2") else (vytlačte "chyba hľadania \ n" " ;)

(?! vzor) - pohľad dopredu negáciou:

Príklad:

$ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (?! \ +) /) # Nájdite číslicu, za ktorou nenasleduje "+" (vytlačte "$ 1 \ n"; # Výsledok "2") else (vytlačte " chyba hľadania \ n " ;)

(? ismx) - "interné" modifikátory. Je vhodné ho použiť v šablónach, kde je napríklad potrebné zadať modifikátor vo vnútri šablóny.

Pravidlá regulárneho výrazu. (regulárny výraz)

  1. Akákoľvek postava stojí sama za seba, pokiaľ nejde o metaznak. Ak potrebujete vrátiť späť metaznak, uveďte pred ním znak „\“.
  2. Reťazec znakov označuje reťazec týchto znakov.
  3. Sada možných znakov (trieda) je uzavretá v hranatých zátvorkách "", čo znamená, že na tomto mieste sa môže objaviť jeden zo znakov uvedených v zátvorkách. Ak je prvý znak v zátvorke "^" - potom sa na tomto mieste vo výraze nemôže objaviť žiadny zo zadaných znakov. V rámci triedy môžete použiť znak „-“ na označenie rozsahu znakov. Napríklad a-z je jedno z malých písmen latinskej abecedy, 0-9 je číslo atď.
  4. Fórum portálu PHP. SU

) Ukázal som vám príklad použitia regulárnych výrazov na nájdenie konkrétnych častí zdrojového kódu stránky. Teraz sa naučíme, ako ich napísať sami. Táto zručnosť vám pomôže písať, vyčistiť text od nepotrebných fragmentov, vyhľadať potrebné časti vo veľkých objemoch textu atď.

Táto téma je dosť ťažká, ale pokúsim sa stručne zdôrazniť najdôležitejšie body. Neviem, ako veľmi to dokážem, ale dúfam, že lekcia bude užitočná.
Na začiatok teda v PHP existuje niekoľko funkcií na prácu s regulárnymi výrazmi, no najčastejšie sa používajú tri:

  • preg_replace - vyhľadávanie a nahradenie textu zodpovedajúceho regulárnemu výrazu;
  • preg_match - len bežné vyhľadávanie;
  • preg_split - vyhľadávanie a rozdelenie textu.

Aspoň v predchádzajúcich lekciách sme ich používali. Skôr namiesto preg_match tam bol preg_match_all, ale to je v podstate to isté, len to druhé nepreruší vyhľadávanie po prvom nájdení. To znamená, že ak použijeme preg_match, nenájdeme všetky výskyty, ale iba prvý.

Voľba, v ktorej situácii použiť ktorú funkciu, je pomerne jednoduchá. Potrebujeme nahradiť - používame nahradiť, ako v prípade, keď sme potrebovali odstrániť nepotrebné časti kódu stránky, pamätáte?

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

Prvým parametrom funkcie je regulárny výraz, ktorý definuje, čo hľadáme. Druhým je to, čo nahrádzame. Po tretie – Kam sa pozeráme. Preto sme tu vzali premennú $ page a priradili k nej výsledok funkcie preg_replace, kde sme hľadali všetky zaškrtávacie políčka input type = a tiež otváracie a zatváracie označenia. Nahradili ich reťazcom „, to znamená, že sa jednoducho odstránili. Dúfam, že tu je všetko jasné. K rozboru samotného výrazu (prvý parameter funkcie) prejdeme o niečo neskôr.
Bol tam aj príklad použitia preg_match_all, ktorý prišiel vhod pri hľadaní všetkých odkazov vo zvyšku textu. Potom sme potrebovali odkazy, pretože obsahovali kľúčové slová, ktoré sme analyzovali. Tu je to, čo sa stalo:

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

Prvým parametrom je opäť regular, nájsť všetky odkazy, ktoré sú prirodzene uzavreté v značke „a“ (ak nie ste priateľskí s html značkami, prečítajte si to). Druhá je premenná, ktorá obsahuje text, podľa ktorého bude vyhľadávanie prebiehať. Tretím parametrom je premenná, do ktorej sa umiestni výsledok - $ ok. Potom už zostáva len prejsť všetkými potrebnými $ ok prvkami, aby sme získali kľúčové rybky, ktoré potrebujeme. Samostatne treba povedať, že na výstupe dostaneme viacrozmerné pole. Preto to vypisujeme tak komplikovane: $ ok [$ j]. Ak chcete vidieť štruktúru poľa, použite funkciu nižšie a všetko pochopíte.

Print_r ($ ok);

Zdá sa, že sme prišli na funkcie, ktoré sme použili na prácu. Teraz už zostáva len naučiť sa písať práve tieto regulárne výrazy, ktoré sú prvým parametrom každej z týchto metód. Prejdime k tomu najdôležitejšiemu.

Ako písať štamgastov

Najprv sa pozrime na základné konštrukcie. Výrazy majú možnosti. Sú špecifikované jedným písmenom a napísané na konci, pred ktorým je lomka.

Okrem toho sú podporované nasledujúce metaznaky:

Metaznaky môžu mať modifikátory:

No a teraz môžeme prejsť k rozboru našich štamgastov z minulej lekcie. Na základe vyššie uvedených tabliet sa pokúsme pochopiť, čo máme. Tu je výraz:

/^] / i

Prvá a posledná lomka „/“ označujú, že sa v nich nachádza regulárny výraz. Zároveň za posledným dáme "i", toto je možnosť, ako v prvej tabuľke - nerozlišuje sa veľké a malé písmená. Vnútri lomiek samá pravidelná čiara. Začína sa znakom menej ako a vstupnou značkou a všetkým, čo nasleduje, až po znak bodky, čo je jednoduchý text, ktorý treba hľadať. Ale samotný bod a symboly za ním - to je už zaujímavejšie. V tomto prípade konštrukcia ". *?" znamená ľubovoľnú postupnosť znakov. To znamená, že ak skombinujete len text a danú konštrukciu, tak vyberieme celý text po prvom výskyte až do konca. Ak chcete zastaviť, musíte splniť buď koncovú html značku "väčšie ako", alebo znak nového riadku. Tento dizajn nám dáva túto príležitosť:

Symboly v hranatých zátvorkách sú akoby spojené logickým ALEBO. Koniec je znamienko väčšie ako ALEBO začiatok riadku.
To je celý výraz, v ňom nastavujeme počiatočnú, strednú a koncovú podmienku. Nie je to ťažké, však? Tu je ilustrácia pre prehľadnosť:

Rozložíme ešte jednu, aby sme všetko stuhli. Hľadali sme ich podľa odkazov:

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

Čítame výraz. Opäť najskôr zahoďte lomky a možnosti. Príznaky "uis" sú pochopiteľné, okrem "u", ktoré som neopísal - naznačuje, že používame kódovanie Unicode. Veľa nezostáva. Začiatkom je značka „a“, ktorá sa otvorí, potom prichádza trieda

čo znamená NIE viac ani menej (otváranie a zatváranie html tagov), teda v tomto prípade ľubovoľné znaky. Do triedy sa pridá „+?“, čo znamená, že táto trieda bude prítomná 1 alebo viackrát (ale aspoň 1 krát určite). A potom prichádza záverečná html značka pre značku „a“. Vo vnútri odkazu je text, ktorý nastavuje skupina

Nevieme predsa, aký text tam bude, preto definujeme takúto skupinu. A na konci záverečná značka "a":

Upozorňujeme, že lomku vynechávame spätnou lomkou, aby bola vnímaná ako obyčajný text.

Fuh. Téma je naozaj dosť zložitá, chce to prax. Možno niečo nerobím úplne optimálne a vy dokážete vytvárať iné, správnejšie regulárne výrazy, ale som rovnaký samouk ako vy, preto nesúďte striktne, radšej sa podeľte o svoje možnosti v komentároch. Tiež, ak niečo nie je jasné - komentáre a kontaktná stránka sú k vašim službám.

Regulárne výrazy sú špeciálne vzory na nájdenie podreťazca v texte. S ich pomocou môžete vyriešiť nasledujúce úlohy v jednom riadku: „skontrolujte, či reťazec obsahuje čísla“, „nájdite všetky e-mailové adresy v texte“, „nahradte niekoľko po sebe idúcich otáznikov jedným“.

Začnime jednou populárnou programátorskou múdrosťou:

Niektorí ľudia, keď stoja pred problémom, si myslia: „Áno, som múdry, vyriešim to regulárnymi výrazmi.“ Teraz majú dva problémy.

Vzorové šablóny

Začnime niekoľkými jednoduchými príkladmi. Prvý výraz na obrázku nižšie hľadá sekvenciu 3 písmen, kde prvé písmeno je „k“, druhé je akékoľvek ruské písmeno a tretie „t“ nerozlišuje veľké a malé písmená (napríklad „mačka“ alebo „CAT“ zodpovedá tomuto vzoru). Druhý výraz hľadá čas v texte vo formáte 12:34.

Akýkoľvek výraz začína oddeľovacím znakom. Symbol / sa zvyčajne používa ako tento, ale môžete použiť aj iné symboly, ktoré v bežných vzoroch nemajú žiadny špeciálny účel, napríklad ~, # alebo @. Alternatívne oddeľovače sa používajú, ak sa vo výraze môže objaviť /. Potom nasleduje vzor reťazca, ktorý hľadáme, nasleduje druhý oddeľovač a na konci môže byť jedno alebo viac písmen vlajky. Poskytujú ďalšie možnosti pri vyhľadávaní textu. Tu je niekoľko príkladov vlajok:

  • i - hovorí, že vyhľadávanie by nemalo rozlišovať veľké a malé písmená (štandardne sa rozlišujú malé a veľké písmená)
  • u - hovorí, že výraz a hľadaný text používajú kódovanie utf-8, nielen latinské písmená. Bez neho nemusí vyhľadávanie ruských (a akýchkoľvek iných nelatinských) znakov fungovať správne, preto by ste ho mali vždy používať.

Samotná šablóna pozostáva z pravidelných symbolov a špeciálnych konštrukcií. Napríklad písmeno „k“ v pravidelných riadkoch znamená samo seba, ale symboly znamenajú „na tomto mieste môže byť ľubovoľné číslo od 0 do 5“. Tu je úplný zoznam špeciálnych znakov (v príručke php sa nazývajú metaznaky) a všetky ostatné znaky v regulárnom výraze sú normálne:

Nižšie budeme analyzovať význam každého z týchto symbolov (a tiež vysvetlíme, prečo sa písmeno "ё" vykresľuje oddelene v prvom výraze), ale teraz skúsme použiť naše regulárne výrazy na text a uvidíme, čo sa stane. Php má špeciálnu funkciu preg_match ($ regexp, $ text, $ match), ktorá berie ako vstup bežný vzor, ​​text a prázdne pole. Skontroluje, či text obsahuje podreťazec, ktorý sa zhoduje s daným vzorom, a vráti 0, ak nie, alebo 1, ak nejaký existuje. A do odovzdaného poľa v prvku s indexom 0 sa vloží prvá nájdená zhoda s regulárnym výrazom. Napíšme jednoduchý program, ktorý aplikuje regulárne výrazy na rôzne reťazce:

Po zoznámení sa s príkladom si regulárne výrazy preštudujeme podrobnejšie.

Zátvorky v regulárnych výrazoch

Zopakujme si, čo znamenajú rôzne typy zátvoriek:

  • Zložené zátvorky a (1,5) určujú počet opakovaní predchádzajúceho znaku - v tomto príklade výraz hľadá 1 až 5 po sebe idúcich písmen "a"
  • Hranaté zátvorky znamenajú "ľubovoľný z týchto znakov", v tomto prípade písmená a, b, c, x, y, z alebo číslo od 0 do 5. Ďalšie špeciálne znaky ako | alebo * - predstavujú obyčajný znak. Ak je na začiatku hranatých zátvoriek symbol ^, význam je opačný: „ľubovoľný jeden znak, okrem špecifikovaných“ – napríklad [^ a-c] znamená „ľubovoľný znak okrem a, b alebo c“.
  • Zátvorky zoskupujú znaky a výrazy. Napríklad vo výraze abc + znamienko plus odkazuje iba na písmeno c a tento výraz hľadá slová ako abc, abcc, abccc. A ak vložíte zátvorky a (bc) +, potom kvantifikátor plus odkazuje na sekvenciu bc a výraz hľadá slová abc, abcbc, abcbcbc

Poznámka: V hranatých zátvorkách môžete špecifikovať rozsahy znakov, ale nezabudnite, že ruské písmeno ё ide oddelene od abecedy a ak chcete napísať „akékoľvek ruské písmeno“, musíte napísať [a-yayo].

Bexsles

Ak ste si prezreli iné návody na regulárny výraz, určite ste si všimli, že spätné lomítko sa všade píše inak. Niekde píšu jedno spätné lomítko: \ d, ale tu sa v príkladoch opakuje 2 krát: \\ d. prečo?

Jazyk regulárnych výrazov vyžaduje, aby ste spätnú lomku napísali raz. Avšak v jednoduchých a dvojitých úvodzovkách v PHP má spätné lomítko tiež špeciálny význam: príručka o reťazcoch. Napríklad, ak napíšete $ x = "\ $"; potom to PHP interpretuje ako špeciálnu kombináciu a do reťazca vloží iba znak $ (a regulárny motor nebude vedieť o spätnej lomke pred ním). Ak chcete vložiť sekvenciu \ $ do reťazca, musíme zdvojnásobiť spätnú lomku a napísať kód ako $ x = "\\ $"; ...

Z tohto dôvodu sme v niektorých prípadoch (kde má sekvencia znakov v PHP špeciálny význam) povinní zdvojnásobiť spätnú lomku:

  • Na zapísanie \ $ do regulárneho výrazu napíšeme kód "\\ $"
  • Ak chcete zapísať \\ do regulárneho výrazu, zdvojnásobíme každú spätnú lomku a napíšeme "\\\\"
  • Ak chcete napísať spätnú lomku a číslo (\ 1) do bežnej mriežky, spätná lomka musí byť zdvojnásobená: "\\ 1"

V ostatných prípadoch jedna alebo dve spätné lomky dávajú rovnaký výsledok: "\\ d" a "\ d" vložia do reťazca dvojicu znakov \ d - v prvom prípade 2 spätné lomky sú sekvenciou na vloženie spätnej lomky, v druhom prípade neexistuje žiadna špeciálna sekvencia a znaky sa vložia tak, ako sú. Môžete skontrolovať, aké znaky sú vložené do reťazca a čo vidí modul regulárneho výrazu pomocou echo: echo "\ $"; ... Áno, je to ťažké, ale čo sa dá robiť?

Špeciálne konštrukcie v regulároch

  • \ d hľadá ľubovoľnú jednu číslicu, \ D - ktorýkoľvek znak okrem číslice
  • \ w zodpovedá ľubovoľnému jednotlivému písmenu (akejkoľvek abecede), číslici alebo podčiarkovníku _. \ W sa zhoduje s ľubovoľným znakom okrem písmena, čísla a podčiarkovníka.

Existuje tiež vhodná podmienka na označenie hranice slova: \ b. Táto konštrukcia znamená, že na jednej strane musí byť znak, ktorým je písmeno / číslo / podčiarkovník (\ w), a na druhej strane nie. Napríklad v texte chceme nájsť slovo „mačka“. Ak napíšeme regulárny výraz / cat / ui, potom nájde poradie týchto písmen kdekoľvek - napríklad vo vnútri slova "dobytok". Toto sme zjavne nechceli. Ak do regulárneho výrazu pridáme slovnú hraničnú podmienku: / \ bcat \ b / ui, tak sa teraz bude hľadať iba samostatné slovo „cat“.

Manuálny

  • Syntax regulárneho výrazu PHP, podrobný popis