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?