Zář
30

Jak v PHP nahradit zastaralé funkce ereg a eregi

By majlan  //  Tipy, Webová tvorba  //  Komentářů: 7

V rámci mé bakalářky (úprava informačního systému, více napíšu časem) jsem převzal již existující PHP skript, ve kterém se vyskytovaly funkce ereg a eregi. Ty slouží k hledání v řetězci pomocí regulárních výrazů, od verze PHP 5.3 jsou však již zastaralé a proto bylo třeba je nahradit. Přestože je to triviální operace, chvilku jsem se u toho zasekl, proto předkládám jednoduchý postup, jak se těchto „vykopávek“ zbavit.

Ereg má následující syntaxi: ereg(regulární výraz, prohledávaný řetězec, pole obsahující nalezené řetězce)

Náhradou za funkci ereg je preg_match, který umožňuje zachovat stejnou syntaxi, je však nutné lehce upravit podobu regulárního výrazu, ten nyní vyžaduje použití tzv. delimiterů (je to dáno tím, že funkce ereg využívá POSIX regulárních výrazů, zatímco preg_match přešla na PCRE (Perl Compatible Regular Expression)).

Právě zde jsem narazil na problém, kdy jsem jako delimiter použil znak ‚/’, ten jsem měl ale i uvnitř regulárního výrazu a tudíž bylo nutné jej escapovat, na což jsem nemohl nějakou chvíli přijít. Protože tento znak se v regulárních výrazech může vyskytovat poměrně často, doporučuji používat spíše ‚#‘ nebo ‚~’.

<?php
ereg("[0-9]+", "Honzovi je 14 let", $vek);
preg_match("#[0-9]+#", "Honzovi je 14 let", $vek);
// 14
 
eregi("karel", "Jmenuji se Karel a mám rád nanuky", $jmeno);
preg_match("#karel#i", "Jmenuji se Karel a mám rád nanuky", $jmeno);
// Karel
?>

Stejně je tomu i v případě funkce ereg_replace, která slouží pro nahrazení textu pomocí regulárního výrazu a má tuto syntaxi: ereg_replace(regulární výraz, čím se nahradí, v čem se nahradí).

Tentokrát použijeme funkci preg_replace, opět se stejnou syntaxí.

$novy = ereg_replace("[0-9]+", "\\0\\0", "Honzovi je 14 let");
$novy = preg_replace("#([0-9]+)#", "$1$1", "Honzovi je 14 let");
// Honzovi je 1414 let
 
$novy = eregi_replace("karel", "\\0\\0", "Jmenuji se Karel a mám rád nanuky");
$novy = preg_replace("#(karel)#i", "$1$1", "Jmenuji se Karel a mám rád nanuky");
// Jmenuji se KarelKarel a mám rád nanuky

Všimněte si odlišné syntaxe regulárního výrazu pro funkci preg_replace, více o PCRE zde.

7 komentářů k “Jak v PHP nahradit zastaralé funkce ereg a eregi”

  • Hmm, pěkné, ale proč jsi o tom psal? Aby každý věděl, že jsi objevil Ameriku?

    VA:F [1.9.20_1166]
    +1 / -8
    • Hm, proč píšeš ty sem? Aby každý věděl, že jsi jelito? :-)))

      VN:F [1.9.20_1166]
      +13 / -0
    • Ach jo .. ty lidi

      VA:F [1.9.20_1166]
      +0 / -0
  • Děkuji za článeček, byl pro mě poučením.
    Ještě větším poučením je níže uvedená diskuse (zda typická pro nás Čechy nevím).
    Na jedné straně snaha a tvorba na druhé straně kritika (zcela nekonstruktivní) a boření.
    Jak dopadl výsledek konfrontace tvoření a boření.
    Tvůrce přešel do netvůrčí agrese a osobního a vulgárního útoku.

    Poučení: Tvůrci, tvořte a nás co na to nemáme nechejte svému osudu :-)
    Janeg

    VA:F [1.9.20_1166]
    +5 / -1
  • If(eregi(„://“, $page)){
    Echo(„Nesnaž se lamo…“);
    } else {
    require_once(„config.php“);}

    jak nahradíš toto ?:-)

    VA:F [1.9.20_1166]
    +0 / -0
  • Děkuji za článek, moc mi pomohl.

    VA:F [1.9.20_1166]
    +2 / -1
  • Upozornil bych na několik odlišností v ereg() vs. preg_match(), které asi většinou nikomu vadit nebudou, ale je dobré o nich vědět:

    1. ereg() vrací délku nalezeného řetězce, pokud nebyl zadán třetí parametr, nebo vrací FALSE / 1, pokud třetí parametr zadán byl. Pokud však nalezne řetězec délky 0, vrací 1 (na znamení, že match proběhl správně, i když je výsledkem „nic“ – např. ereg(‚(.*)’, “)). Prostě trochu guláš :-)

    2. ereg() vrací FALSE při chybě, ale i v případě, že není nalezena shoda. Preg_match() vrací FALSE při chybě, ale 0 nebo 1 pokud není / je nalezena shoda.

    3. Ve třetím parametru, kde se vrací nalezené řetězce odpovídající jednotlivým „závorkám“, se chování obou funkcí trochu liší. Pokud na nějakou závorku vůbec nedojde, ereg() do pole přidá na příslušnou pozici alespoň FALSE, kdežto preg_match() dotyčnou pozici do výsledného pole vůbec nepřidá.

    VA:F [1.9.20_1166]
    +0 / -0

Vyjádři svůj názor



Zajímá vás cokoliv o mobilních aplikacích? Uvažujete o spolupráci? Kontaktujte mne na seitler@reinto.cz

O mně

Jmenuji se Milan Seitler a jsem spoluzakladatelem společnosti Reinto s.r.o., ve které se věnujeme mobilním i webovým aplikacím a marketingu.

Zabývám se celým procesem tvorby mobilních a webových aplikací. Nejvíce se věnuji návrhu aplikace a UX/UI designu. Kladu velký důraz na jednoduchost a srozumitelnost uživatelského rozhraní.

Zajímám se o online i offline podnikání, fascinují mě úspěšní lidé, kteří se nebojí tvrdé práce. Mou hlavní motivací je konkurence, která mě vždy nutí jít do všeho naplno, protože nerad prohrávám.

Mám rád hudbu, knížky, sport a cestování.

milan@seitler.cz

Odkazy

Inzerujte zde!

Kupte si odkaz! PR 3, SR 2

Inzerujte zde!

Kupte si odkaz! PR 3, SR 2

Inzerujte zde!

Kupte si odkaz! PR 3, SR 2

Partner links