(N)escapování dat z DB, aneb jak escapovat jen částečně
- Saavikam
- Člen | 17
Ahoj,
- mám v DB uložené texty – aktuální informace apod. Někdy se stane, že v DB je text, kde jsou použité přímo HTML kódy (strong, em), případně odkazy. Když text escapuji, tak se
<strong>tučně</strong>
přepíše
<strong>tučněr</strong>
Ráda bych, kdyby se text vypisoval escapovaný, kromě HTML entit.
- Současně bych ráda, aby se ručně zalomené texty převedli na <br />. Používám v Latte tento kod:
$d = "bla<br/>"
{$d|escape|nl2br|noescape}
Výpis je:
bla<br/><br>
Omlouvám se za dotaz, ale nemůžu přijít na to co s tím.
- ryder
- Člen | 17
Ahoj,
pokud chceš odstranit HTML tagy ze stringu, tak asi nejjednoduší bude
použít macro striptags
{$string|striptags|nl2br|noescape}
Pozor na to, že to používá PHP fci strip_tags, která není úplně dokonalá. Mnohem lepší by bylo použít nějakou knihovnu na filtrování HTML, např. HTML Purifier.
Editoval ryder (5. 4. 2016 19:30)
- Oli
- Člen | 1215
ten vykřičník je starší zápis pro noescape
. Takže ti to
neescapuje nic… Pokud jsi si jistá, že v db nebude záškodnický kod
(opakuji jistá), tak v pohodě.
Já používám něco jako níže při ukládání do databáze a při
výpisu neescapuju celej výstup {$text|noescape}
.
Jestli to je dostatečný, doufám…
switch($str)
{
case self::INLINE_TAGS:
$tags = '<code><span><label><a><br><p><b><i><del><strike><u><small><ul>'
. '<ol><li><hr><dl><dt><dd><sup><sub><big><figure><figcaption><strong><em><h1>'
. '<h2><h3><h4><h5><h6>';
break;
case self::ELEMENTARY_TAGS:
$tags = '<strong><em><del><a>';
break;
default:
$tags = '<code><span><div><label><a><br><p><b><i><del><strike><u><img>'
. '<video><audio><iframe><object><embed><param><blockquote><mark><cite><small>'
. '<ul><ol><li><hr><dl><dt><dd><sup><sub><big><pre><code><figure><figcaption>'
. '<strong><em><table><tr><td><th><tbody><thead><tfoot><h1><h2><h3><h4><h5><h6>';
break;
}
return strip_tags($str, $tags);
Editoval Oli (6. 4. 2016 7:10)