Autor Zpráva
Aleš Janda
Profil
Zdravím, řeším takový zajímavý problém parsování JS kódu. V tomto kódu:

<script>
alert("Před značkou</script>za značkou");
</script>

prohlížeč ukončí <script> už na prvním výskytu řetězce </script> - tedy uprostřed alertu. V JavaScriptu je syntax error, zbytek JS se vypíše jako text. To samo o sobě je pro mě celkem překvapivé, vzhledem k tomu, že daný kontext by se evidentně měl brát jako řetězec. Ale budiž. Toto lze ošetřit přidáním HTML komentáře <!-- za <script>, bohužel pak to skončí na sekvenci --></script>:

<script><!--
alert("Před značkou--></script>za značkou");
--></script>

Zde nejsem schopen ošetřit skript tak, aby na dané sekvenci neskončil a text normálně zpracoval. Proč se tak prohlížeče chovají? A jak to rozumně ošetřit?

Proč tohle řeším: mám jednoduchou stránku, do které přes JS dávám několik dynamicky generovaných hodnot. Je jich několik, jsou krátké, nechci to řešit Ajaxem (vytvářet nový požadavek) atd., prostě se to vygeneruje přímo do <script>. Problém je ten, že těchto několik hodnot je uživatelsky definovaných a uživatel sekvenci --></script> může samozřejmě použít. Co s tím?

Nahrazení < za &lt; nepomáhá (resp. zobrazí se &lt; místo <), zatím jsem to vyřešil nahrazením < za <"+". To se mi ale pochopitelně nelíbí.

Máte nápady?
P.S.: Při zobrazování náhledu tady v diskusi daná sekvence dokonce ořízne titulek :-)
Keeehi
Profil
Aleš Janda:
Proč se tak prohlížeče chovají?
A jak jinak by se asi měly chovat? Skončil komentář a objevil se tag který znají, tak ho zpracují.

V řetězci nahraďte
< za \x3C
> za \x3E
a bude vše fungovat.
Aleš Janda
Profil
Keeehi:
V řetězci nahraďte
< za \x3C
> za \x3E
a bude vše fungovat.

Díky, tohle funguje.

K tomu vysvětlení - ano, když se nad tím zamyslím, je to vlastně jasné :-)
Nicméně se prohlížeče chovají opravdu zvláštně. Na jednu stranu tedy napřed vyrobí DOM strom z tagů a poté začnou zpracovávat celý skript, na druhou stranu už nijak neinterpretují entity a tak např. && musím zapsat v kódu jako && a ne &amp;&amp; - taktéž s porovnáváním < a >. Je o tomto chování někde nějaké bližší info?
Keeehi
Profil
Aleš Janda:
nijak neinterpretují entity
No ještě aby je interpretovali. jak byste asi chtěl na web o matematice třeba toto: 5<A a zároveň 6>A?

Aleš Janda:
Je o tomto chování někde nějaké bližší info?
Nevzpomínám si, že bych něco takového někde viděl.
_es
Profil
Malo by stačiť aj nahradenie </script> za <\/script>.
Pamätá sa to lepšie, než číslo unicode znaku.
Aleš Janda
Profil
Keeehi:
No ještě aby je interpretovali.
Myslel jsem to tak, že by HTML/XML parser mohl celou stránku schroupat (i se skriptem) a nahradit entity všude - když už si teda nehraje na nějaký kontext skriptu. Příklad bych napsal takto: 5&lt;A a zároveň 6&gt;A, prohlížeč by převedl, uživateli by se zobrazilo 5<A a zároveň 6>A - tedy identicky jako v HTML.

_es:
Shodou okolností jsem narazil na funkci json_encode(), která řetězec zakóduje tak jak potřebuji. A na tomto případě to dá před lomítko zpětné lomítko, tedy jak uvádíš. Použiju tedy tuto funkci a hotovo :-)

Oběma děkuji.
Chamurappi
Profil
Reaguji na Aleše Jandu:
V elementech <script>, <style> a <xmp> se neinterpretují entity, ani zápisy dalších elementů (vyjma ukončovací značky toho právě otevřeného), nicméně i přesto jsou to docela obyčejné elementy. Jinými slovy, HTML parser se nestará o to, co je uvnitř.
Pak ještě existuje skupina elementů, ve kterých se interpretují entity, ale neinterpretují elementy, např. <textarea> a <title>.

Toto lze ošetřit přidáním HTML komentáře
Spolehlivě jen v quirku, ne? (To je jediná anomálie, o kterou se HTML parser stará.)

Myslel jsem to tak, že by HTML/XML parser mohl celou stránku schroupat (i se skriptem) a nahradit entity všude
V XML je nahradí všude. V XML bys musel zapsat ampersandy a menšítka entitami. (Nebo použít <![CDATA[ … ]]> sekci.)
V atributech onclick a spol. se interpretují entity i v HTML.
Aleš Janda
Profil
Chamurappi:
Díky za velice přínosné doplnění. Nepřestává mě udivovat, kolik humusu se za ta léta webu na HTML nabalilo :-)
Chamurappi
Profil
Reaguji na Aleše Jandu:
Tenhle humus má oporu v SGML. V DTD jsou obsahy elementů <script> a <style> definované jako CDATA, což znamená, že mají fungovat tak, jak fungují.
Jediná svévolně prohlížeči přidaná anomálie je, že funguje to zabalení do komentáře.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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

0