Autor Zpráva
xlifer
Profil
Katerý způsob řešení je vhodnější? Případně, lze to udělat i nějak jinak a lépe?

Způsob řešení 1:

function formatuj($text)
{
$text = ERegI_Replace("\[b\]", "</b>", $text);
$text = ERegI_Replace("\[/b\]", "</b>", $text);
$text = ERegI_Replace("\[i\]", "</i>", $text);
$text = ERegI_Replace("\[/i\]", "</i>", $text);
return $text;
}

$text = "Toto slovo bude tučně a toto slovo bude kurzívou.";

echo formatuj($text);



Způsob řešení 2:

function formatuj2($text)
{
$text = strtr($text, array("\[b\]" => "<b>", "\[/b\]" => "</b>","\[i\]" => "<i>", "\[/i\]" => "</i>")); 
// !!! zpětné lomítka tam být nemají, to jen pro kolizi se stejným formátování v tomto fóru !!!
return $text;
}

$text = "Toto slovo bude tučně a toto slovo bude kurzívou.";

echo formatuj2($text);


A ještě k tomu dotaz, zda doporučujete ukládát text již naformátovaný do databáze,
nebo až při výpisu/výběru textu z db upravovat pro výstup? (s ohledem na zpětnou editaci?)

Díky.
Str4wberry
Profil
1) Použít regulární výrazy.
2) „Čistší“ řešení je formátovat až při výstupu, protože ten teoreticky nemusí být jen HTML kód. Nicméně formátování při každém výpisu zase může zbytečně zdržovat (výpis se zpravidla provádí mnohem častěji než zápis). A zpětný převod z HTML není problém.
Alphard
Profil
1. Skupina ereg je deprecated, používejte preg.

2. Obě řešení mají nedostatek v tom, že se převede i samotné [i], tj. mohou vznikat chyby. Z tohoto pohledu je vhodnější samostatné volání funkce pro každý tag, ale nahrazovat párově.

3. Záleží na rozsahu a vytížení. Je možné i ukládat formátovaný spolu s neformátovaným. Tato diskuse ukládá do databáze již naformátovaný kód, pak se zpětně převádí, šetří se s tím výkon.
xlifer
Profil
Alphard:

add 1) co je špatně na ereg? nechápu proč je nepřijatelný nebo nevhodný...

add 2) A jak to provést, aby se převádělo vždy párově?
Keeehi
Profil
xlifer:
1) Nemůžeš se spolehnout na to, že bude v příští verzi PHP. Je totiž označena za zastaralou.
2) Třeba takto:
$z = array(
    "/\[i\](.*?)\[\/i\]/is",
    "/\[b\](.*?)\[\/b\]/is",
    "/\[u\](.*?)\[\/u\]/is",
    "/\[img\](.*?)\[\/img\]/is",
    "/\[url=(http:\/\/){0,1}(.*?)\](.*?)\[\/url\]/is"
  );
  $na = array(
    "<i>$1</i>",
    "<b>$1</b>",
    "<u>$1</u>",
    "<img src=\"$1\" />",
    "<a href=\"http://$2\" target=\"_blank\">$3</a>"
  );

  $upraveny_text = preg_replace($z,$na,$vstupni_text);
panther
Profil
xlifer:
add 1) co je špatně na ereg? nechápu proč je nepřijatelný nebo nevhodný...
deprecated != nepřijatelný nebo nevhodný. Jak píší v manuálu, „This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.“.

add 2) A jak to provést, aby se převádělo vždy párově?
starší témata jsi neprocházel, že? Nejsi první, kdo toto řeší.
xlifer
Profil
Keeehi:

Super, to by šlo :-) Díky!

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:

0