LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (22) - Regulární výrazy

PHP obsahuje nástroje pro práci s regulárními výrazy. Ukažme si, jak tyto funkce použít v praktickém programování.

9.7.2004 15:00 | Petr Zajíc | Články autora | přečteno 99316×

Komerční sdělení: Pořádáme Kurzy PHP

Pokud jste na PHP přešli z ASP (jako kdysi já) pravděodobně Vám regulární výrazy nic neříkají. A přitom jsou tak zábavné. Podívejme se, jak celá ta věc funguje.

Název "výrazy" je trochu matoucí. V díle seriálu o výrazech jsme prohlásili, že výraz je cokoli, co má hodnotu. Regulární výrazy jsou naproti tomu jen vžitým pojmenováním mechanismu, který nám umožňuje pracovat s řetězci a maskami. Nejlepší bude opustit šedivou teorii a vrhnout se hned na nějaké příklady.

Mějme například masku "Petr". Této masce vyhoví řetězce "Petr je borec", "Je doma Petr?" i "Honza, Petr a Pavel", protože všechny obsahují slovo Petr. Výraz "Franta je taky borec" pochopitelně masce nevyhoví, neb slovo Petr neobsahuje. V PHP přesně na tohle testování existuje funkce ereg, která vrací TRUE nebo FALSE pro případy, kdy řetězec vyhoví nebo nevyhoví masce:

<?
  
echo (integer) ereg("Petr", "Petr je borec");
  echo (integer)
ereg("Petr", "Je doma Petr?");
  echo (integer)
ereg("Petr", "Honza, Petr a Pavel");
  echo (integer)
ereg("Petr", "Franta je taky borec");
?>

To bylo jednoduché. Síla regulárních výrazů však spočívá v něčem trochu jiném. Teď budeme postupovat tak, že nejdřív si vysvětlíme, co všechno lze použít pro definici masky, pak se podíváme na funkce v PHP s maskami pracující a nakonec si ukážeme na nějaké praktické příklady.

Masky

Situaci kolem regulárních výrazů komplikuje fakt, že maska může obsahovat takzvané metaznaky. Některé častější jsem se pokusil shrnout do tabulky:

Metaznak
Znamená
Výrazu:
Vyhoví
Nevyhoví
^
Začátek řetězce
^Petr Petr je borec
Petr není borec
Borec je Petr
Franta a Petr jsou borci
$
Konec řetězce
PC$
Mám PC
Pracuji na PC
Moje PC je rozbité
PC má dnes každý
.
Libovolný znak
s.x
sex
six
tix
sad
*
Předchozí znak se smí libovolněkrát opakovat (i nulakrát)
s*t
prst
půst
prut
prase
+
Předchozí znak tam bude minimálně jednou
s+t
prst
srst
prut
?
Předchozí znak tam bude maximálně jednou s?t
prejt
prst
psst
síť
[]
Libovolný znak ze znaků v závorce
[0123456789]
12
356
8 kusů
kusy
kila
litry
()
Všechny znaky ze znaků v závorce
(obec)
obecný
obecní
všeobecný
věcný
jablečný
všeobjímající
|
Rozdělení na podvýrazy
A|B
Astronaut
Babička
edém
čistě
\
Následující metaznak bude chápán jako znak
\+
Vše, co obsahuje "+"
Co neobsahuje "+"

Existují ovšem i další metaznaky, které si můžete nastudovat v manuálu. Většinou Vám tyto budou stačit. Pochopitelně, že v jedné masce může být více metaznaků, čímž mohou regulární výrazy extrémně nabýt na složitosti (a síle).

PHP a funkce pro regulární výrazy

O funkci ereg, která vrátí TRUE v případě, že daný řetězec vyhovuje masce, jsme již psali. Funkce ereg_replace funguje tak, že části řetězce vyhovující masce nejen pozná, ale nahradí jiným řetězcem. Její použití si ukážeme v závěru. Funcke ereg i ereg_replace rozlišují velikost písmen. Existují funkce eregi a eregi_replace, které provádějí totéž jako jejich protějšky, ale velikost písmen přitom nerozlišují.

Konečně existuje funkce split (a spliti nerozlišující velikost písmen) pro dělení řetězce maskou. Výsledkem je pole řetězců vzniklých tímto rozdělením a funkce se svojí filozofií podobá funkci explode, kterou jsme již v tomto seriálu popisovali.

Ony existují ještě další funkce pro práci s regulárními výrazy v PHP, stejně jako existují i další masky. Pojďme se ale nyní podívat, jak nám taková kupa nových informací může nějak pomoci v praktických příkladech.

Praxe

V praxi například budete chtít zjistit, jestli se dá zadaný řetězec chápat jako celé číslo. K tomu byste mohli využít něco jako:

<?
  
function JeCeleCislo ($cislo)
  {
    return
ereg("^[\+\-]?[1234567890]+$",$cislo);
  }
  echo (integer)
JeCeleCislo ("1");
  echo (integer)
JeCeleCislo ("-6");
  echo (integer)
JeCeleCislo ("3.5");
  echo (integer)
JeCeleCislo ("4 kusy");
?>

Celé je to založeno na výsledku funkce ereg a jeji vyhodnocování bychom mohli číst následovně (v závorkách uvádím zápis toho, co bylo právě řečeno, jako metaznak): Abych jakožto funkce ereg vrátila TRUE, musel by řetězec $cislo nějak vypadat. Měl by začínat (^) znakem plus (\+) nebo ([]) mínus (\-), který tam bude maximálně jednou (?). Pak musí následovat některá z číslic ([1234567890]), což je věc, která se může opakovat, ale nejmíň jednou (+) tam být musí. Tím celá záležitost musí končit ($). Hezké, že?

Nebo budete chtít testovat, jestli předaný řetězec může představovat platnou e-mailovou adresu. Třeba to bude vypadat nějak takhle:

<?
  
function JeEmail ($cislo)
  {
    return
ereg("^.+@.+\..+$",$cislo);
  }
  echo (integer)
JeEmail ("nekdo@neco.cz");
  echo (integer)
JeEmail ("nekdoneco.cz");
  echo (integer)
JeEmail ("@neco.cz");
  echo (integer)
JeEmail ("neco.cz");
  echo (integer)
JeEmail ("nekdo@necocz");
  echo (integer)
JeEmail ("nekdo@neco.");
?>

Zase vysvětlení: Výraz by měl začínat (^) libovolným znakem (.), který se může opakovat, ale minimálně jednou tam být musí (+). Pak bude zavináč, pak opět jeden nebo více znaků (.+) a konečně doslovná tečka (\.) a nějaké ty znaky (.+). Tím to celé končí ($).

Pozn.: Není to tak úplně jednoduché. RFC definuje daleko složitější věci, které mohou představovat platnou e-milovou adresu, ale jako příklad už by to nebylo tak názorné.

A ještě jeden příklad do třetice. Slibuji, že už to nebude tak složité. Pomocí ereg_replace nahraďme všechna místa s více mezerami jen jednou mezerou:

<?
$retezec
= "Mám   řetězec   se      zbytečně  mnoho mezerami,   že    ????";
echo
$retezec."<BR>\n";
echo
ereg_replace(" +", " ", $retezec);
?>

Neboli: Všechny výskyty řetěce, který obsahuje nejméně (+) jednu mezeru, nahraď jednou mezerou. Ono to skutečně funguje. Nechte si zobrazit zdrojový kód stránky v prohlížeči, než to začnete považovat za nefunkční kus kódu.

Pokud máte nějaké další příklady použití regulárních výrazů (nejlépe z praxe), uvítám jejich uvedení v diskusi. Sám jsem v PHP mnoho jiných příkladů než ty výše uvedené neviděl.

Verze pro tisk

pridej.cz

 

DISKUZE

regex 12.7.2004 14:13 by default
L Re: regex 12.7.2004 15:24 Petr Zajíc
preg 3.11.2005 14:40 Viktor L
triedy znakov 24.10.2006 18:58 Adriana
L Re: triedy znakov 24.10.2006 21:52 Petr Zajíc
Minimalni vyskyt, maximalni vyskyt 15.2.2007 12:39 slune
L Re: Minimalni vyskyt, maximalni vyskyt 15.2.2007 13:03 slune
cenzura 9.4.2007 21:08 A.M.
L Re: cenzura 10.4.2007 07:43 Petr Zajíc
Metaznaky 10.2.2008 20:39 Dan Pelíšek
L Re: Metaznaky 11.2.2008 00:48 Ondřej Čečák
  L Re: Metaznaky 12.2.2008 22:21 Dan Pelíšek
    L Re: Metaznaky 13.2.2008 13:08 Ondřej Čečák
      L Re: Metaznaky 14.2.2008 02:49 Aleš Hakl
ereg 12.10.2008 22:16 Kocmi
  L Re: ereg 13.10.2008 00:00 Aleš Hakl
    L Re: ereg 13.10.2008 16:53 Kocmi
      L Re: ereg 13.10.2008 18:23 Aleš Hakl
        L Re: ereg 13.10.2008 22:31 Kocmi




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.1.2017 20:18 / martin horky
Spolupraca linuxu a microsoftu

17.1.2017 9:57 / Pavel Hrubeš
Re: Externí USB televizní karta

4.1.2017 11:24 / Marcum
extension to house

3.1.2017 10:09 / bolden
country cottages

4.12.2016 22:54 / František Kučera
Dárek

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze