it-swarm-pt.tech

Como parar um TEXTAREA html de decodificar entidades html

Eu tenho um problema estranho:

No banco de dados, tenho um literal e comercial lt semicolon: 

<div  

sempre que for impresso em uma tag textarea de html, o código-fonte da página mostrará > como >.

Como faço para parar essa decodificação?

21
Ronan Dejhero

No PHP, isso pode ser feito usando htmlentities (). Exemplo abaixo.

<?php
  $content = "This string contains the TM symbol: &trade;";
  print "<textarea>". htmlentities($content) ."</textarea>";
?>

Sem htmlentities (), a área de texto interpretaria e exibiria o símbolo TM (™) em vez de "& trade;".

http://php.net/manual/en/function.htmlentities.php

17
Chris Hubbard

Não é possível impedir que as entidades sejam decodificadas em uma área de texto [1], pois o conteúdo de uma área de texto é not (diferentemente de um elemento de estilo ou script) CDATA intrínseco, embora a recuperação de erros possa às vezes Dê a impressão de que é.

A definição do elemento textarea é:

<!ELEMENT TEXTAREA - - (#PCDATA)       -- multi-line text field -->

isto é, contém PCDATA que é descrito como :

Texto do documento (indicado pela construção SGML "#PCDATA"). O texto pode conter referências de caracteres. Lembre-se de que elas começam com & e terminam com um ponto-e-vírgula (por exemplo, Herg&eacute;'s adventures of Tintin contém a referência de entidade de caractere para o caractere e agudo).

Isso significa que quando você digita (o HTML inválido de) "start of tag" (<) o navegador corrige para "menos que assinar" (&lt;) mas quando você digita "start of entity" (&), que é permitido, nenhuma correção de erro ocorre.

Você precisa escrever o que você quer dizer. Se você quiser incluir algum HTML como dados, deverá converter qualquer caractere com um significado especial para sua respectiva referência de caracteres. 

Se os dados forem:

&lt;div

Então o HTML deve ser:

<textarea>&amp;lt;div</textarea>

Você pode usar as funções padrão para converter isso (por exemplo, PHP's htmlspecialchars ou Perl's HTML :: Entities module ).

NB 1: Se você estava usando XHTML [2] (e realmente usando, não conta se você servir como text/html ) então você poderia usar um bloco CDATA explícito:

<textarea><![CDATA[&lt;div]]></textarea>

NB 2: Ou se os navegadores implementaram corretamente o HTML 4


Ok, mas a questão é. por que os decodifica mesmo assim? assumindo que eu adicionei &, salve o textarea, ti será salvo & lt; , mas exibido como <, salvá-lo novamente irá convertê-lo de volta para <(mas ele permanecerá <no banco de dados), salvando novamente salvará um <no banco de dados, por que a textarea o decodifica?

  • O server envia (para o navegador) dados codificados comoHTML
  • O browser envia (para o servidor) dados codificados como application/x-www-form-urlencoded (ou multipart/form-data).

Como o navegador não está enviando os dados como HTML, os caracteres não são representados como entidades HTML.

Se você pegar os dados recebidos do cliente e, em seguida, colocá-los em um documento HTML, deverá primeiro codificá-los como HTML.

36
Quentin

Você pode servir seu conteúdo de banco de dados a partir de uma página separada e, em seguida, colocá-lo na área de texto usando um JavaScript (jQuery) Ajax-call:

request = $.ajax
({  
    type: "GET",
    url: "url-with-the-troubled-content.php",           
    success: function(data)
    {
        document.getElementById('id-of-text-area').value = data;    
    }
}); 

Explicado em 

http://www.endtask.net/how-to-prevent-a-textarea-element-from-decoding-html-entities/

1
Victor

Eu tive o mesmo problema e acabei de fazer duas substituições no texto para mostrar a partir do banco de dados antes de deixá-lo na área de texto:

myString = Replace(myString, "&", "&amp;")
myString = Replace(myString, "<", "&lt;")

Substitua n: o 1 para enganar a área de texto para mostrar os códigos. Replace n: o 2: Sem essa substituição você não pode mostrar a palavra "" dentro da textarea (ela terminaria a tag textarea).

(Código Asp/vbscript acima, traduza para um método de substituição da sua escolha de idioma)

1
Andreas Jansson

Você precisa ter certeza de que isso é processado no navegador:

<textarea name="somename">&amp;lt;div</textarea>

Essencialmente, isso significa que o & em &lt; deve ser codificado em html para &amp;. Como fazer isso dependerá das tecnologias que você está usando.

UPDATE: Pense nisso assim. Se você quiser display <div> dentro de uma textarea, você terá que codificar <> porque caso contrário, <div> seria um elemento HTML normal para o navegador:

<textarea name="somename">&lt;div&gt;</textarea>

Dito isto, se você quiser display &lt;div&gt; dentro de uma textarea, você terá que codificar & novamente, porque o navegador decodifica entidades HTML ao renderizar HTML. Não tem nada a ver com o seu banco de dados.

1
Lukas Eder

Eu encontrei uma solução alternativa para ler e trabalhar com navegador, simplesmente ler o texto do elemento () usando jQuery, ele retorna os caracteres como caracteres de exibição e permite que eu escreva de textarea para innerHTML de um div usando a propriedade via html () ...

0