TechNET: Developer · Mobilmánia · Wapko * EASY www.dobijanie.sk *
MAJACIK HLAVNY IMAGE STRANKY
30. Januára 2003, Štvrtok 
Lekcia 9 - PHP a regulárne výrazy
 

Regulárne výrazy sú spôsobom, ako vyhodnocovať obsah textových reťazcov. Pomocou regulárnych výrazov je možné definovať masku, ktorá sa využíva pri vyhodnocovaní reťazca a jeho separovania na časti.
Regulárny výraz je textový reťazec, ktorý obsahuje ľubovolný text. Reťazec potom regulárnemu výrazu vyhovuje / ak obsahuje zadaný text/ alebo nevyhovuje /ak ho neobsahuje/. Spôsob vyhodnocovania reťazca ovplyvňujú metaznaky - znaky so špeciálnym významom

^ zastupuje začiatok reťazca
$ zastupuje koniec reťazca
. zastupuje jeden ľubovolný znak

Pre ilustráciu zopár príkladov:

Regulárnemu výrazu abcde vyhovujú reťazce abcdefgh aj tralabcdefg...nevyhovuje však dcabcdabc. Použijeme prvý metaznak: ^  
Regulárnemu výrazu ^ahoj potom vyhovejú len tieto reťazce: ahoj-milan, ahoj, ahoj aj ahoj - musia začínať na ahoj. 
Podobne regulárnemu výrazu ahoj$ vyhovejú len reťazce Láska ahoj, ahoj či akurát-ahoj - musia končiť na ahoj. 
Kombinácii obidvoch metaznakov ^abc$ vyhovuje len a len reťazec abc. Bodka zastupuje ľubovolný znak., čo znamená že regulárnemu výrazu dobr. vyhovujú reťazce dobrá aj dobrý.
V prípade, že chceme použiť hocijaký metaznak v pôvodnom význame, napríklad $ v zmysle dolára, je nutné použiť lomítko. Príklad na takýto prípad:

Príklad 1

^\$ahoj

vyhovujú len reťazce $ahoj, $ahojky-ahoj, $ahojahoj podobne

\\ahoj

vyhovujú len reťazce \ahoj či \ahojky

Ďalšie metaznaky sú hviezdička, plus a otáznik s nasledujúcimi významom - ovplyvňujú počet opakovaní reťazca, podobne ako metaznak zložená zátvorka

* Musí sa opakovať 0 až N krát alebo vôbec (0..N)
+ Musí sa opakovať aspoň raz (1..N)
? Musí sa opakovať najviac raz (0..1)
{min,max} Musí sa opakovať najmenej min krát, maximálne max krát (min,max)
{min,} Musí sa opakovať najmenej min krát (min...N)
{N} Musí sa opakovať práve N krát (N)

Príklad 2 - Opakovanie väčšej časti regulárneho výrazu zabezpečia zátvorky

*.

vyhovujú všetky reťazce

ah+oj

vyhovujú  reťazce ahoj, ahhoj, ahhhoj

(ah)+oj

vyhovujú  reťazce ahoj, ahahoj, axojahahoj

(ah)*oj

vyhovujú  reťazce oj, ahoj, ahhoj, ahhhoj

(ah)?oj

vyhovujú  reťazce oj, ahoj

^(ah){1}oj

vyhovuje  len ahoj

(ah){3,}oj

vyhovuje  malahahahoj, ahahahahoj

^(ah){1,2}oj

vyhovuje len ahoj, ahahoj

Ďalší metaznak [ slúži pre množinu. Regulárnemu výrazu ^[ab]c vyhovej[ len výrazy ac, bc. Rúra (pipe) umožní zapísať aj podvýrazy, napríkald pre dni. (Pondelok|Utorok|Streda|Stvrtok|Piatok|Sobota|Nedeľa) Pipe je možné kombinovať aj so zátvorkou, napríklad pre:
((Zz)uzana|(Jj)akub). Je mo6n0 použiť  aj skrátenú  verziu pre množinu, a a to [0-9] pre číslice a [a-zA-Z] pre písmená ANGLICKEJ ABECEDY. Naše šťaveľčekové písmená tam nepatria!
Regulárne výrazy [[:<:]] a [[:>:]] zastupujú začiatok a koniec slova. 5 miestne číslo vyhovie výrazu [[:<:]][digit]{5}[[:<:]]. Tu som použil ďalší regulárny výraz pre triedu. Zoznam všetkých tried znakov je v tabuľke:

[[alnum]] Písmená a číslice
[[alpha]] Písmená angl.abecedy
[[blank]] Medzera, tabulátor
[[cntrl]] Riadiace znaky
[[digit]] Číslice
[[graph]] Grafické znaky
[[lower]] Malé písmená angl. abecedy
[[print]] Tlačitelné znaky
[[punct]] Interpukcia a ďalšie znaky
[[space]] Akákoľvek medzera /tabulátor, nový riadok, stránka..atď/
[[upper]] Veľké písmená angl.abecedy
[[xdigit]] Číslice a písmena šesťnástkovej sústavy

Pre prácu s reg. výrazmi slúžia funkcie Ereg, EregI,Ereg_Replace a EregI_Replace. Funkcia Ereg má tvar:

integer Ereg(string reg_výraz, string reťazec, array [subreťazce])

čo znamená že funkcia Ereg porovná reťazec s reg. výrazom a zhodné časti rozdelí podľa zátvorkiek v reg. výraze do poľa array. Dosť bolo teórie, trošku praxe:

Príklad 3 - kontrola emailu

if (ereg("^(.+)@(.+)\\.(.+)$", $email, $casti_enmailu)) {
  // adresa je OK
  echo ("Adresa je OK <BR>\n" .
            "E-mail je: $casti_emailu[0] <BR>\n" .
            "Uživateľské meno: $casti_emailu[1] <BR>\n" .
            "Domena: $casti_emailu[2] <BR>\n".
            "Top-level domena: $casti_emailu[3] <BR>\n");

else echo ("Chybna adresa <BR>\n");

Funkcia EregI robí to isté, len neberie ohľad na malé a veľké znaky. Funkcia Ereg_Replace nahradí časť reťazca, ktorý vyhovuje reg. výrazu reťazcom náhrada a jej syntax je nasledovná:

string Ereg_Replace(string reg_vyraz, string nahrada, string retazec)

To by bolo asi všetko, čo zhruba viem o regulárnych výrazoch v PHP. Často sa hodia, niekde je však jednoduchšie použiť aj iné funkcie na prácu s reťazcami, ako Explode či iné.








N Á V R A T

Copyright 2003 MGX


 
Dnes má meniny
Ema
nic.sk - domeny + hosting
PHP Club

Klub
 Registrácia
 Informácie
Special
 XML I diel
 
XML II diel
 
XML III diel
 
XML IV diel
 
XML V diel
 
XML VI diel
 
XML VII diel
 
XML VIII diel
 
XML IX diel
 
Anketa č. 21
Považujem sa za...
(Odpovedalo už 1579 ľudí)

PHP guru (157)
 10%
Perfektného programátora v PHP( 117)
 7%
Strednú triedu (373)
 24%
Začiatočníka (743)
 47%
Čo je PHP ? (189)
 12%

Klikni na zvolenú odpoveď!
Výsledky minulých ankiet.
 
Diskusia

PRÍSPEVKY
 Podľa tém
 Podľa dáta
 Podľa klikov
 Iba dnešné

UTILITY
 Registrácia
 Zmena hesla
 Zmena profilu

Dobré linky:
PC News
Developer
  (c) 2003 www.php.sk