Autor Zpráva
HGD
Profil
jaký je rozdíl mezi funkcemi:
ereg_replace
preg_replace
str_replace
AM_
Profil
ereg_replace - nahrazení pomocí regulárního výrazu standardu POSIX - ustupuje se od toho, jelikož to není moc dobře napsané a má to mnohem méně možností než:
preg_replace - nahrazení pomocí regulárního výrazu se syntaxí dle jazyka PERL
str_replace - prosté nahrazení konkrétního podřetězce za jiný

reg. výraz je jakýsi "textový vzorec", kterým se dá vyjádřit např. "všechny části textu ve formátu 4 písmena, 2 čísla" - složitějšími výrazy se dá zobecnit třeba zápis e-mailové adresy a pak třeba v textu všechny nahradit odkazem.
Nox
Profil
Jen minidoplnění AM_ - pokud postačí použít str_replace, tak použij to, bude to mnohem rychlejší
HGD
Profil
tak když už sem si to tu založil...

mám kód:
$text=preg_replace("#\[q\](.+)\[/q\]#","<q>\\1</q>","[q]citace[/q]");


ale výsledek z toho leze takovej, že sice v HTML je <q>citace</q> ale na stránce se interpretuje jako "citace"
AM_
Profil
HGD
ano. očekáváš jiné chování?
HGD
Profil
čekam že na stránce se vypíše text bez uvozovek, asi to chápu blbě jak to mam napsaný.
Poradíte jak na to?
AM_
Profil
čekam že na stránce se vypíše text bez uvozovek, asi to chápu blbě jak to mam napsaný.
Poradíte jak na to?
ano, chápeš to blbě :) <q> je tag označující citaci a část prohlížečů to interpretuje tak, že dá text do uvozovek, viz http://www.jakpsatweb.cz/html/text.html#q
na tvém místě bych ten replace napsal tak, aby se to nenahrazovalo <q>, ale třeba <span> s nějakou třídou, který si už nastyluješ podle libosti.
panther
Profil
AM_
na tvém místě bych ten replace napsal tak, aby se to nenahrazovalo <q>, ale třeba <span> s nějakou třídou, který si už nastyluješ podle libosti.
myslíš, že je dobře překrucovat si nesémantické značky obrazu svému? Chci-li citovat, stejně dám tex do uvozovek.
AM_
Profil
panther
Chci-li citovat, stejně dám tex do uvozovek.
->„čekam že na stránce se vypíše text bez uvozovek
takže HGD zřejmě nechce ;)
myslíš, že je dobře překrucovat si nesémantické značky obrazu svému?
tak nabídni jiné řešení, jak ty uvozovky odstranit, já jiné neznám, proto jsem poukázal na toto.
panther
Profil
AM_
takže HGD zřejmě nechce ;)
tak to se omlouvám, to jsem přehlédl.. Chyba.
HGD
Profil
takže asi bude nejlepší používat tag <blockquote> ?
panther
Profil
HGD
takže asi bude nejlepší používat tag <blockquote> ?
tag „<blockquote>“ je blokový, takže pokud nechceš citovat uprostřed odstavce, klidně jej užij.
HGD
Profil
jj, už to tam mam a bude to nejlepší asi

a ještě jeden dotázek, mam kód:
function quote($tag){
  preg_match('#\"(.+)\"#',$tag,$match);
  
  $Q="<blockquote><strong>$match[1] napsal:</strong><br>";
    return $Q;
}

$text=preg_replace_callback("#<blockquote \"(.+)\">#",quote,$text);


ale hází: Warning: preg_match() expects parameter 2 to be string, array given
HGD
Profil
Dobrý už to mam :) Sice pořád nemů pochopit fci preg_replace_callback ale funguje:
function quote($tag){

  $Q="<blockquote><strong>$tag[1] napsal:</strong><br>";
    return $Q;
}
AM_
Profil
Název callback funkce musí být předán jako řetězec, nikoli identifikátor, takže parametr "quote" bude v uvozovkách.
navíc
$Q="<blockquote><strong>$tag[1] napsal:</strong></blockquote>";

odřádkovat za blokovým elementem nemusíš (proto je blokový :) ), ale musíš jej ukončit.
HGD
Profil
ale ale vždyt mi to funguje, ikdyž ten parametr neni v uvozovkách...
a chybu to házelo ve funkci preg_match()

-> tohle je jenom malá úprava ve výpisu, konec tagu už tam je... ;)
AM_
Profil
Jo, teď vidím tu hrůzu. Vysvětlím, jak preg_replace_callback funguje:
$text=preg_replace_callback("#<blockquote \"(.+)\">#","quote",$text);

ty uvozovky si tam dopiš, nedefinované konstantě se implicitně jako hodnota přiřadí její název, takže PHP tyhle chyby toleruje, ale vrací notice (nebo warning, teď nevím).
Takže:
1. funkce porovná řetězec $text se zadaným regulárním výrazem
2. pro každý nalezený podřetězec odpovídající reguláru zavolá:
quote($match)
přičemž $match je pole reprezentující shodu (tedy nultý prvek je celý nalezený řetězec, další prvky jsou ozávorkované části)
3. výsledek funkce quote dosadí to $text za příslušný nalezený text, tedy proto "replace".
Takže v callbacku už žádné porovnávání regulárem neděláš, už pracuješ jen s nalezeným textem.
HGD
Profil
AM_ díky moc!!! Takle sem to nikde vysvětlený nenašel na netu ;)

a jestli můžu v souvislosti ještě jeden dotaz :)
Potřebuju do stránky vypsat kód, jedno jestli HTML, CSS nebo PHP atd... a nevim jak to opravit aby to fungovalo. Mám:
$text=preg_replace_callback("#\[code\](.+)\[/code\]#","code",$text);

function code($tag){

  $C=htmlspecialchars($tag[1]);
  $C="<code>$C</code>";
    return $C;
}

ale stejně se ten kód vykoná :(
AM_
Profil
To je dost divné řešení, tady se vykašli na preg_replace_callback, nejdřív si celý řetězec převeď pomocí htmlspecialchars a pak použij prostý preg_replace...
AM_
Profil
jo, teď vidím, že by to vlastně šlo u toho prvního, nevím, na co tam potřebuješ callback :) ten se používá na složité věci, které nejde do reguláru zapsat.
HGD
Profil
když mam v kodu
$text=preg_replace("#\[code\]([^\<br \/\>])\[/code\]#","<code>\\1</code>",$text);
tak to sice funguje, ale jen do tý doby než to narazí na ENTER při psaní, což je asi \n myslim... a nevim jak to opravit, poradíte ?
AM_
Profil
myslímže modifikátor "s" - první parametr replace bude "#\[code\]([^\<br \/\>])\[/code\]#s"

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: