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 101768×

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.9.2018 23:30 /František Kučera

Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.


Přidat komentář

9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business. Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář

12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář

16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář

18.6.2018 0:43 /František Kučera
Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.
Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

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

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

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