Hlavní navigace

Regulární výrazy v PHP: Regexpové funkce vs. Textové funkce

Luboš Turek

Vědět, kdy použít regulární výraz a kdy textovou funkci, je velmi důležité. Regulární výrazy jsou sice pěkná věc, ale musí se vědět, jak je používat správně :) Proto se podíváme na textové funkce podobné regexpovým funkcím, které jsme doposud používali.

Úvod

Tento díl jsem začlenil do seriálu o regulárních výrazech proto, že používání regexpu tam, kde úplně klidně postačí obyčejná funkce pracující s textem, je úplně zbytečné a pomalé. Regulární výrazy jsou sice pěkná věc, ale musí se vědět, jak je používat správně :) Popsat všechny textové funkce by bylo na samostatný seriál, a tak popíšu alespoň ty důležité a podobné těm regexpovým. Na ostatní alespoň odkážu :)

Kdy co použít?

Abych to uvedl na pravou míru, v textových funkcích nemůžeme použít metaznaky, pouze normální text. Ovšem používání textových funkcí je daleko rychlejší. Obecně platí: Nepoužívat regulární výraz tam, kde můžu použít normalní textovou funkci. Toto budeme dnes dodržovat :)

Bratříček Eregu (StrPos)

Funkce Ereg má hned několik sobě podobných textových funkcí. Jsou to StrStr, StrChr, StrIStr, StrRChratd. Někteří lidé používají k pouhému porovnání řetězců StrStr. Pokud však potřebujete pouze zjistit, zda se výraz v textu vyskytuje, je efektivnější (rychlejší) použít StrPos. Za zmínku stojí i to, že funkce StrChr je stejná jako StrStr. Nenechte se tedy plést jejím významem v C.

StrPos (je v PHP od verze 3) vrací false, pokud hledaný text v řetězci není. Pokud je, vrací pozici hledaného textu. Problém je v tom, že znaky jsou číslovány od 0 ( = false). V následujícím skriptu si ukážeme funkci a tento problém vyřešíme použitím operátoru ===.

<?
###########################
# Funkce StrPos - ROOT.cz #
###########################
# hledame $retezec

$text = 'abcd';
$pozice = StrPos($text, $retezec);

echo "<html>\n<body>";

if ($pozice === false) /* vsimnete si operatoru === */
  {
  echo '$retezec'."($retezec) se nevyskytuje v ".'$textu'."($text)";
  }
else
  {
  echo '$retezec'."($retezec) se vyskytuje v ".'$textu'."($text) na pozici $pozice";
  }

echo "</body>\n</html>";
?> 


Bratříček Ereg_Replacu (Str_Replace)

Funkce je v PHP od release verze 3.0.6 a je to textový protějšek Ereg_Replace nebo perlovského Preg_Replace. Funkce najde retezec v textu a ten nahradí novým_řetězcem. Syntaxe je Str_Replace(re­tezec, novy_retezec, text). Tradičně si vše ukážeme na krásném příkladu aneb zvolte si svou oblíbenou barvu :)

<?
###############################
# Funkce StrReplace - ROOT.cz #
###############################
# pouzivame $oblibena_barva

$text = 'My favourite colour\'s blue';
$text2 = Str_Replace("blue", $oblibena_barva, $text);

echo "<html>\n<body>";

echo $text2;

echo "</body>\n</html>";
?> 


Od PHP 4.0.5 je možno použít pole ve všech parametrech. Do PHP 4.3.3 oxidoval ve funkci jeden menší bug (info zde). Je v plánu, že od PHP 5 bude přidám další parametr count, který bude udávat počet záměn. Pokud byste potřebovali nahradit text pouze v určité části řetězce, prozkoumejte, jak funguje funkce SubStr_Replace.

Příbuzní Splitu :)

Funkci Split (popř. SplitI), kterou jsme se zabývali minule, se až moc podobá funkce Explode (tou jsme se zabývali v minulém dílu) a StrTok, který by se dal označit za vzdálenějšího příbuzného (třeba tetku z 2nd kolene :))

Příště… :)

Příští díl bude poslední. Proto se podíváme na praktické příklady, kde regulární výrazy v PHP použít. Budou to trochu složitější kejkle než ty příklady, kterými jsme se dosud zabývali :)

Linky

Následující linky vedou k PHP manuálu

Linky z části o Eregu

StrPos
StrStr
StrChr
StrIStr
StrRChr

Linky z části o Ereg_Replace

Str_Replace
SubStr_Replace

Linky z části o Splitu

Explode (minulý díl seriálu)
Explode (manuál)
StrTok

Soubory

Použité skripty

Našli jste v článku chybu?

26. 4. 2005 15:33

Tex (neregistrovaný)
Super článek, hodně mi pomohl. Pro začátečníka velmi užitečné.

11. 12. 2003 16:17

Autor (neregistrovaný)

prispevky ohledne prodlouzeni serialu o PCRE do redakce :)))

120na80.cz: Boreliózu nelze žádným testem prokázat

Boreliózu nelze žádným testem prokázat

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

Vitalia.cz: To nejhorší při horečce u dětí: Febrilní křeče

To nejhorší při horečce u dětí: Febrilní křeče

120na80.cz: Rovnátka, která nejsou vidět

Rovnátka, která nejsou vidět

Root.cz: Nová třída SD karet A1 s vysokým výkonem

Nová třída SD karet A1 s vysokým výkonem

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Vitalia.cz: Potvrzeno: Pobyt v lese je skvělý na imunitu

Potvrzeno: Pobyt v lese je skvělý na imunitu

Měšec.cz: Za palivo zaplatíte mobilem (TEST)

Za palivo zaplatíte mobilem (TEST)

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

DigiZone.cz: V Plzni odstartovalo Radio 1

V Plzni odstartovalo Radio 1

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

Lupa.cz: Levný tarif pro Brno nebude, je to kartel

Levný tarif pro Brno nebude, je to kartel

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok

DigiZone.cz: Ohrozí Freedom TV přechodové sítě?

Ohrozí Freedom TV přechodové sítě?

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Vitalia.cz: Test na HIV je zdarma i za pět set

Test na HIV je zdarma i za pět set

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET