Aparentemente, isso é mais difícil de encontrar do que eu pensava. E até é tão simples ...
Existe uma função equivalente aos htmlspecialchars do PHP incorporados ao Javascript? Eu sei que é bastante fácil implementar isso você mesmo, mas usar uma função interna, se disponível, é apenas melhor.
Para aqueles que não estão familiarizados com o PHP, htmlspecialchars traduz coisas como <htmltag/>
em<htmltag/>
Eu sei disso escape()
e encodeURI()
não funciona dessa maneira.
javascript
html
escaping
html-encode
Bart van Heukelom
fonte
fonte
Respostas:
Há um problema com o código da solução - ele escapará apenas da primeira ocorrência de cada caractere especial. Por exemplo:
Aqui está o código que funciona corretamente:
Atualizar
O código a seguir produzirá resultados idênticos aos acima, mas ele tem um desempenho melhor, principalmente em grandes blocos de texto (obrigado jbo5112 ).
fonte
Isso é codificação HTML. Não há nenhuma função nativa de javascript para fazer isso, mas você pode pesquisar no Google e fazer algumas bem feitas.
Por exemplo, http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/
EDIT:
Isto é o que eu testei:
Resultado:
<htmltag/>
fonte
encodeURIComponent
faz e não faz o que o OP pediu. Então você pode editar por favor? Não consigo desfazer meu -1.div
elemento e um nó de texto. Criar um nó de texto com o texto `<img src = bogus onerror = alert (1337)>` apenas criará um nó de texto, não umimg
elemento.Vale a pena ler: http://bigdingus.com/2007/12/29/html-escaping-in-javascript/
Nota : Execute isso apenas uma vez. E não o execute em cadeias já codificadas, por exemplo,
&
torna-se&amp;
fonte
Com o jQuery, pode ser assim:
De questão relacionada Escapando seqüências de caracteres HTML com jQuery
Conforme mencionado no comentário, aspas duplas e aspas simples são deixadas como estão para esta implementação. Isso significa que esta solução não deve ser usada se você precisar criar atributo de elemento como uma string html bruta.
fonte
<!-- Caps rage begin -->
Esta resposta deve ter pontuação NEGATIVA, uma vez que nem chega perto de responder à pergunta "HtmlSpecialChars equivalente".<!-- Caps rage end -->
Ele não escapa citações de Jesus Cristo e outras divindades. OMG você jquery pessoas.Aqui está uma função para escapar do HTML:
E para decodificar:
fonte
O Underscore.js fornece uma função para isso:
http://underscorejs.org/#escape
Não é uma função Javascript interna, mas se você já estiver usando o Underscore, é uma alternativa melhor do que escrever sua própria função se as seqüências de caracteres para converter não forem muito grandes.
fonte
Ainda outra abordagem é renunciar a todo o mapeamento de caracteres e converter todos os caracteres indesejados em suas respectivas referências numéricas de caracteres, por exemplo:
Observe que o RegEx especificado lida apenas com os caracteres específicos dos quais o OP queria escapar, mas, dependendo do contexto em que o HTML usado será usado, esses caracteres podem não ser suficientes. Artigo de Ryan Grove O escape de HTML é mais do que &, <,>, e " é uma boa leitura do tópico. E, dependendo do seu contexto, o seguinte RegEx pode muito bem ser necessário para evitar a injeção de XSS:
fonte
amostra:
fonte
Provavelmente, você não precisa dessa função. Como seu código já está no navegador *, você pode acessar o DOM diretamente, em vez de gerar e codificar HTML, que precisará ser decodificado para trás pelo navegador para ser realmente usado.
Use a
innerText
propriedade para inserir texto sem formatação no DOM com segurança e muito mais rápido do que usar qualquer uma das funções de escape apresentadas. Ainda mais rápido do que atribuir uma sequência pré-codificada estática parainnerHTML
.Use
classList
para editar classes,dataset
definirdata-
atributos esetAttribute
para outros.Todos estes irão lidar com a fuga para você. Mais precisamente, não é necessário escapar e nenhuma codificação será executada por baixo **, pois você está trabalhando em torno do HTML, a representação textual do DOM.
* Esta resposta não se destina a usuários JavaScript do servidor (Node.js, etc.) )
** A menos que você o converta explicitamente em HTML real posteriormente. Por exemplo, acessando
innerHTML
- é o que acontece quando você executa$('<div/>').text(value).html();
sugestões em outras respostas. Portanto, se seu objetivo final é inserir alguns dados no documento, dessa maneira, você fará o trabalho duas vezes. Além disso, você pode ver que no HTML resultante nem tudo é codificado, apenas o mínimo necessário para que seja válido. Isso é feito de acordo com o contexto, é por isso que esse método jQuery não codifica aspas e, portanto, não deve ser usado como um escaper de uso geral. O escape de aspas é necessário quando você está construindo HTML como uma sequência com dados não confiáveis ou contendo aspas no lugar do valor de um atributo. Se você usa a API do DOM, não precisa se preocupar em escapar.fonte
el.textContent = str; el.innerHTML = el.innerHTML.replace(/\n/g, '<br>')
), ou definir o CSSwhite-space
propriedade parapre
oupre-wrap
innerText
vez detextContent
. Embora um pouco mais lento e com algumas outras diferenças ao ler a propriedade, é mais intuitivo, pois ele faz a<br>
substituição automaticamente ao atribuir a ela.Para usuários do Node.JS (ou usuários que utilizam o tempo de execução do Jade no navegador), você pode usar a função de escape do Jade.
Não faz sentido escrever você mesmo se alguém o está mantendo. :)
fonte
Estou elaborando um pouco a resposta do okw.
Você pode usar as funções DOM do navegador para isso.
Isso retorna
<escapeThis>&
Ele usa a função padrão
createElement
para criar um elemento invisível, depois usa a funçãotextContent
para definir qualquer string como seu conteúdo e, em seguida,innerHTML
para obter o conteúdo em sua representação HTML.fonte
fonte
Espero que isso vença a corrida devido ao seu desempenho e, o mais importante, não a uma lógica encadeada usando .replace ('&', '&'). Replace ('<', '<') ...
fonte
Um revertido:
fonte
<
e&gr;
em uma string.To write a greater than sign in HTML type &gt;
ele será exibido incorretamente em>
vez de>
A OWASP recomenda que "[e] xcept para caracteres alfanuméricos, [você deve] escape de todos os caracteres com valores ASCII menores que 256 com o
&#xHH;
formato (ou uma entidade nomeada, se disponível) para impedir a desativação de um atributo [um]".Então, aqui está uma função que faz isso, com um exemplo de uso:
fonte
Esta solução usa o código numérico dos caracteres, por exemplo,
<
é substituído por<
.Embora seu desempenho seja um pouco pior que a solução usando um mapa , ele tem as vantagens:
fonte