Estou escrevendo uma extensão do Chrome que envolve muitas das seguintes tarefas: higienizar strings que podem conter tags HTML, convertendo <
, >
e &
em <
, >
e &
, respectivamente.
(Em outras palavras, o mesmo que o do PHP htmlspecialchars(str, ENT_NOQUOTES)
- não acho que haja qualquer necessidade real de converter caracteres de aspas duplas.)
Esta é a função mais rápida que encontrei até agora:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Mas ainda há um grande atraso quando eu tenho que passar alguns milhares de cordas por ele de uma vez.
Alguém pode melhorar isso? É principalmente para strings entre 10 e 150 caracteres, se isso fizer diferença.
(Uma ideia que tive foi não me incomodar em codificar o sinal de maior - haveria algum perigo real nisso?)
javascript
html
regex
performance
string
callum
fonte
fonte
Respostas:
Você pode tentar passar uma função de retorno de chamada para realizar a substituição:
Aqui está um teste de desempenho: http://jsperf.com/encode-html-entities para comparar com a chamada da
replace
função repetidamente e usando o método DOM proposto por Dmitrij.Seu caminho parece ser mais rápido ...
Mas por que você precisa disso?
fonte
>
.if (/[<>&"]/.test(str) { ... }
>
é um caractere especial em HTML, portanto, escape-o. Simples assim. :)>
substituição, isso a tornará mais rápida.Esta é uma maneira de fazer isso:
Aqui está uma demonstração.
fonte
Método de Martijn como função de protótipo:
fonte
String
assim ele deve ser escapeHtml, pois não é um escape para uma String em geral. Isso éString.escapeHtml
correto, masString.escape
levanta a questão, "escapar para quê?"Uma solução ainda mais rápida / curta é:
Isso está relacionado a algum vestígio estranho de JavaScript pelo qual o elemento Option retém um construtor que faz esse tipo de escape automaticamente.
Crédito para https://github.com/jasonmoo/t.js/blob/master/t.js
fonte
O código-fonte do AngularJS também tem uma versão dentro do angular-sanitize.js .
fonte
O método mais rápido é:
Este método é cerca de duas vezes mais rápido do que os métodos baseados em 'substituir', consulte http://jsperf.com/htmlencoderegex/35 .
Fonte: https://stackoverflow.com/a/17546215/698168
fonte
Script tudo-em-um:
http://pastebin.com/JGCVs0Ts
fonte
fonte
Não estou totalmente certo sobre velocidade, mas se você está procurando simplicidade, sugiro usar a função de escape lodash / sublinhado .
fonte
Método de Martijn como função única com manipulação da marca " ( usando em javascript ):
fonte
Vou adicionar
XMLSerializer
à pilha. Ele fornece o resultado mais rápido sem usar nenhum cache de objeto (nem no serializador, nem no nó Texto).O bônus adicional é que ele suporta atributos que são serializados de forma diferente dos nós de texto:
Você pode ver o que está realmente substituindo verificando a especificação, tanto para nós de texto quanto para valores de atributo . A documentação completa tem mais tipos de nós, mas o conceito é o mesmo.
Quanto ao desempenho, é o mais rápido quando não está em cache. Quando você permite o armazenamento em cache,
innerHTML
é mais rápido chamar um HTMLElement com um nó de texto filho. Regex seria o mais lento (como comprovado por outros comentários). Claro, XMLSerializer poderia ser mais rápido em outros navegadores, mas em meus testes (limitados), ainnerHTML
é mais rápido.Linha única mais rápida:
new XMLSerializer().serializeToString(document.createTextNode(text));
Mais rápido com cache:
https://jsperf.com/htmlentityencode/1
fonte
Um pouco tarde para o show, mas o que há de errado em usar encodeURIComponent () e decodeURIComponent () ?
fonte