Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno PHP - jak zpracovat znaky

Potřebuji poradit jak převést znaky.
Dejme tomu, že mám řetězec:

<p>hokus<span style="background-color: rgb(255, 0, 0);"> pokus </span>dva</p>
<p>

A potřebuji jej převést zpět na tento řetězec:

<p>hokus<span style="background-color: rgb(255, 0, 0);"> pokus </span>dva</p>
<p>text</p>

To co mě v první chvíli napadlo s funkcí str_replace však poněkud nefunguje:

$body = "&lt;p&gt;hokus&lt;span style=&quot;background-color: rgb(255, 0, 0);&quot;&gt; pokus &lt;/span&gt;dva&lt;/p&gt;
&lt;p&gt;";
$body = str_replace ($body,"&lt;" , "<");
$body = str_replace ($body,"&gt;" , ">");

K nahrazeni a naslednemu vypsani nelze uvazovany postup pouzit.
Potrebuji vedet, jak elegantne z toho ven.
Postup, ktery mě napadá je to snad rozdělit do menších částí (do pole) a to jednotlivě zpracovávat, což
je určitě hodně nefektivní a dnes bych to už ani nevymyslel.

Díky

Předmět Autor Datum
Já nejsem PHPista, ale mám $komentar = Str_Replace("<","&lt;",$komentar); $komentar = Str_Replace("…
Kráťa 31.01.2008 22:54
Kráťa
Právě jsem to zjistil sám. Ano, takže děkuji za odpověď. Zaměnil jsem tam ty argumenty. ]:( Slibuju…
Flash_Gordon 31.01.2008 23:01
Flash_Gordon
O co sa to vlastne snazis? Co ta vedie k tomu prevadzat tie entity na znaky?
mrazik 01.02.2008 13:34
mrazik
Já mám třeba "komentáře" a ty se před uložením do db (vlastně už v náhledu) převádějí z < na entity.…
Kráťa 01.02.2008 13:58
Kráťa
To ze pred ulozenim dat do DB sa prevedu na entity je zamer??? lebo mi tam trosku unika zmysel ... j…
mrazik 01.02.2008 14:43
mrazik
Ano, je to záměr. Kdyby někdo napsal do komentáře <div style="width: 100%; height: 100%; background-…
Kráťa 01.02.2008 14:53
Kráťa
asi
Kráťa 01.02.2008 14:53
Kráťa
možná
Kráťa 01.02.2008 14:54
Kráťa
snad
Kráťa 01.02.2008 14:54
Kráťa
kéž by Proč tady děláte odpovědi s jedním slovem sám sobě? (LaKr) (Kráťa)
Kráťa 01.02.2008 14:54
Kráťa
Ale ved prave na to sa zvykne text pred vypisom konvertovat na entity :-) htmlspecialchars() .....…
mrazik 01.02.2008 15:42
mrazik
Však jsem psal, že PHP není právě můj talíř. I když tuto funkci jsem už také někam dával. Ale dotaz…
Kráťa 01.02.2008 15:55
Kráťa
Často sa zvykne v databáze ukladať HTML-zakódovaný text kvôli tomu, aby ho nebolo treba pri každom v…
los 01.02.2008 16:09
los
Ano na to jsem přišel a funguje to... ale jenom částečně. konkrétně mám tento problém: Řekněme tent… poslední
Flash_Gordon 01.02.2008 16:20
Flash_Gordon

Já nejsem PHPista, ale mám

$komentar = Str_Replace("<","&lt;",$komentar);
$komentar = Str_Replace(">","&gt;",$komentar);

a to mi funguje dobře. Co u toho tvého dát to $body také nakonec a bez mezer?

$body = str_replace ("&lt;","<",$body);
$body = str_replace ("&gt;",">",$body);

Právě jsem to zjistil sám.

Ano, takže děkuji za odpověď. Zaměnil jsem tam ty argumenty. ]:(
Slibuju, že příští čtyři dny už budu pravidelně spát.

EDITACE

Ajaj zjistil jsem velice nepříjemnou věc. Háže to paznaky i při českých znacích.
Neexistuje na to univerzální funkce, která by i české znaky s diakritikou převáděla ?

Takto staticky to nemám šanci všechno ošetřit.

To ze pred ulozenim dat do DB sa prevedu na entity je zamer??? lebo mi tam trosku unika zmysel ... ja by som do DB urcite nedaval entity ...
no a dalsia vec, entity sa predsa automaticky prevadzaju na normalne znaky ... vsak entita je len kod znaku a ked vypises entitu, tak sa vypise znak

Ano, je to záměr. Kdyby někdo napsal do komentáře
<div style="width: 100%; height: 100%; background-color: black; color: red">
hacked by debil
</div>
uloží se to do db s entitami a při načtení z db ty tagy fungovat nebudou, jelikož se načtou jako text. :-) (jsem jako lstivý Afghánec)

Ano na to jsem přišel a funguje to... ale jenom částečně. konkrétně mám tento problém:

Řekněme tento řetězec:

+ěščřžýáíé

$ ™ ®

A ten se mi potvora převede po průchodu tou fcí na toto(jo to <p> neřeš):

<p>+ě&scaron;čřž&yacute;&aacute;&iacute;&eacute;</ p> <p>$ &trade; &reg;</p>

A po aplikování funkce:

function unhtmlentities($string)
{
    // replace numeric entities
    $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
    $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
    // replace literal entities
    $trans_tbl = get_html_translation_table(HTML_ENTITIES);
    $trans_tbl = array_flip($trans_tbl);
    return strtr($string, $trans_tbl);
}

Vyleze:

+Ä›šÄŤĹ™Ĺľýáíé

$ ™ ®

...což znamená, že pro unkodování speciálních znaků jako $ ™ ® je to OK, ale s češtinou to má problém.

Nebyla by rada nebo nápad ?

//EDIT

AHÁÁÁ !
To mrcha. Ono to totiž neprovadí konverzi stejně.
Co tím myslím ? Ten text generuje FCKEditor a ta mrcha se tváří následně:

stisknutím kláves následujících:

+ěščřžýáíéů

vyleze:

+ě&scaron;čř ž&yacute;&aacute;&iacute;&eacute;ů

Což znamená, že ten editor některé znaky konvertuje, ale některé ne....
Co to znamená si ještě musím promyslet...

Jo takže znamená to, že ta funkce přebírá některé znaky a konvertuje, které by měnit neměla.

Takže například písmeno č konvertuje na : ÄŤ

Jde to nějak obejít ?

Zpět do poradny Odpovědět na původní otázku Nahoru