Estoy escribiendo una extensión de Chrome que implica hacer una gran cantidad de trabajo el siguiente: desinfección cadenas que podrían contener etiquetas HTML, mediante la conversión <
, >
y &
a <
, >
y &
, respectivamente.
(En otras palabras, lo mismo que PHP, htmlspecialchars(str, ENT_NOQUOTES)
no creo que haya una necesidad real de convertir caracteres de comillas dobles).
Esta es la función más rápida que he encontrado hasta ahora:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Pero todavía hay un gran retraso cuando tengo que ejecutar algunos miles de cadenas de una vez.
¿Alguien puede mejorar esto? Es principalmente para cadenas de entre 10 y 150 caracteres, si eso marca la diferencia.
(Una idea que tuve fue no molestarme en codificar el signo mayor que, ¿habría algún peligro real con eso?)
fuente
Respuestas:
Puede intentar pasar una función de devolución de llamada para realizar el reemplazo:
Aquí hay una prueba de rendimiento: http://jsperf.com/encode-html-entities para comparar con llamar a la
replace
función repetidamente y usar el método DOM propuesto por Dmitrij.Tu camino parece ser más rápido ...
Sin embargo, ¿por qué lo necesitas?
fuente
>
.if (/[<>&"]/.test(str) { ... }
>
es un carácter especial en HTML, así que escápalo. Simple como eso. :)>
reemplazo, eso lo haría más rápido.Aquí tienes una forma de hacer esto:
Aquí tienes una demostración.
fuente
El método de Martijn como función prototipo:
fuente
String
esto, debería ser escapeHtml ya que no es un escape para una cadena en general. Eso esString.escapeHtml
correcto, peroString.escape
plantea la pregunta, "¿escapar para qué?"Una solución aún más rápida / más corta es:
Esto está relacionado con un extraño vestigio de JavaScript mediante el cual el elemento Option retiene un constructor que hace este tipo de escape automáticamente.
Crédito a https://github.com/jasonmoo/t.js/blob/master/t.js
fuente
El código fuente de AngularJS también tiene una versión dentro de angular-sanitize.js .
fuente
El método más rápido es:
Este método es aproximadamente dos veces más rápido que los métodos basados en 'reemplazar', consulte http://jsperf.com/htmlencoderegex/35 .
Fuente: https://stackoverflow.com/a/17546215/698168
fuente
Secuencia de comandos todo en uno:
http://pastebin.com/JGCVs0Ts
fuente
fuente
No estoy del todo seguro acerca de la velocidad, pero si está buscando simplicidad, sugeriría usar la función de escape lodash / underscore .
fuente
El método de Martijn como función única con el manejo de la marca " ( usando en javascript ):
fuente
Agregaré
XMLSerializer
a la pila. Proporciona el resultado más rápido sin utilizar ningún objeto de almacenamiento en caché (ni en el serializador ni en el nodo de texto).La ventaja adicional es que admite atributos que se serializan de manera diferente a los nodos de texto:
Puede ver lo que realmente está reemplazando al verificar la especificación, tanto para los nodos de texto como para los valores de los atributos . La documentación completa tiene más tipos de nodos, pero el concepto es el mismo.
En cuanto al rendimiento, es el más rápido cuando no se almacena en caché. Cuando permite el almacenamiento en caché, la llamada
innerHTML
a un elemento HTMLElement con un nodo Text secundario es más rápida. Regex sería el más lento (como lo demuestran otros comentarios). Por supuesto, XMLSerializer podría ser más rápido en otros navegadores, pero en mis pruebas (limitadas), ainnerHTML
es más rápido.Línea única más rápida:
new XMLSerializer().serializeToString(document.createTextNode(text));
Más rápido con el almacenamiento en caché:
https://jsperf.com/htmlentityencode/1
fuente
Un poco tarde para el programa, pero ¿qué pasa con el uso de encodeURIComponent () y decodeURIComponent () ?
fuente