Aparentemente, esto es más difícil de encontrar de lo que pensé que sería. E incluso es tan simple ...
¿Existe una función equivalente a los htmlspecialchars de PHP integrados en Javascript? Sé que es bastante fácil implementarlo usted mismo, pero usar una función incorporada, si está disponible, es mejor.
Para aquellos que no están familiarizados con PHP, htmlspecialchars traduce cosas como <htmltag/>
a<htmltag/>
Lo sé escape()
y encodeURI()
no trabajo de esta manera.
javascript
html
escaping
html-encode
Bart van Heukelom
fuente
fuente
Respuestas:
Hay un problema con su código de solución: solo escapará a la primera aparición de cada carácter especial. Por ejemplo:
Aquí hay un código que funciona correctamente:
Actualizar
El siguiente código producirá resultados idénticos a los anteriores, pero funciona mejor, particularmente en grandes bloques de texto (gracias jbo5112 ).
fuente
Eso es codificación HTML. No hay una función nativa de JavaScript para hacer eso, pero puedes buscar en Google y obtener algunas muy bien hechas.
Por ejemplo, http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/
EDITAR:
Esto es lo que he probado:
Salida:
<htmltag/>
fuente
encodeURIComponent
hace y nada de lo que pidió el OP. Entonces, ¿puedes editar por favor? Parece que no puedo deshacer mi -1.div
elemento y un nodo de texto. Crear un nodo de texto con el texto `<img src = bogus onerror = alert (1337)>` solo creará un nodo de texto, no unimg
elemento.Vale la pena leerlo: http://bigdingus.com/2007/12/29/html-escaping-in-javascript/
Nota : solo ejecuta esto una vez. Y no lo ejecute en cadenas ya codificadas, por ejemplo, se
&
convierte en&amp;
fuente
Con jQuery puede ser así:
De la pregunta relacionada Escapar cadenas HTML con jQuery
Como se menciona en el comentario, las comillas dobles y las comillas simples se dejan como están para esta implementación. Eso significa que esta solución no debe usarse si necesita hacer un atributo de elemento como una cadena html sin procesar.
fuente
<!-- Caps rage begin -->
Esta respuesta debe tener un puntaje NEGATIVO ya que NO SE INCLUYE CERCA DE RESPONDER LA PREGUNTA "HtmlSpecialChars equivalente".<!-- Caps rage end -->
It-does-not-escape-quotes-jesus-christ-and-other-deities. Dios mío, jquery personas.Aquí hay una función para escapar de HTML:
Y para decodificar:
fuente
Underscore.js proporciona una función para esto:
http://underscorejs.org/#escape
No es una función de Javascript incorporada, pero si ya está utilizando Underscore, es una mejor alternativa que escribir su propia función si sus cadenas para convertir no son demasiado grandes.
fuente
Otra toma de esto es renunciar a toda la asignación de caracteres por completo y, en cambio, convertir todos los caracteres no deseados en sus respectivas referencias de caracteres numéricos, por ejemplo:
Tenga en cuenta que el RegEx especificado solo maneja los caracteres específicos de los que el OP quería escapar, pero, dependiendo del contexto en el que se utilizará el HTML escapado, estos caracteres pueden no ser suficientes. El artículo de Ryan Grove Hay más en el escape de HTML que &, <,> y " es una buena lectura sobre el tema. Y dependiendo de su contexto, el siguiente RegEx puede ser muy necesario para evitar la inyección de XSS:
fuente
muestra:
fuente
Lo más probable es que no necesites esa función. Dado que su código ya está en el navegador *, puede acceder al DOM directamente en lugar de generar y codificar HTML que el navegador tendrá que decodificar hacia atrás para que se use realmente.
Use la
innerText
propiedad para insertar texto sin formato en el DOM de manera segura y mucho más rápida que con cualquiera de las funciones de escape presentadas. Incluso más rápido que asignar una cadena estática precodificada ainnerHTML
.Se usa
classList
para editar clases,dataset
para establecerdata-
atributos ysetAttribute
para otros.Todos estos se encargarán de escapar por ti. Más precisamente, no se necesita escapar y no se realizará ninguna codificación debajo de **, ya que está trabajando con HTML, la representación textual de DOM.
* Esta respuesta no está destinada a usuarios de JavaScript del lado del servidor (Node.js, etc. )
** A menos que lo conviertas explícitamente a HTML real después. Por ejemplo, al acceder
innerHTML
: esto es lo que sucede cuando ejecuta$('<div/>').text(value).html();
sugerido en otras respuestas. Entonces, si su objetivo final es insertar algunos datos en el documento, al hacerlo de esta manera, hará el trabajo dos veces. También puede ver que en el HTML resultante no todo está codificado, solo el mínimo necesario para que sea válido. Se realiza en función del contexto, es por eso que este método jQuery no codifica comillas y, por lo tanto, no debe usarse como un escapista de propósito general. Se necesita el escape de cotizaciones cuando construye HTML como una cadena con datos que no son de confianza o que contienen comillas en el lugar del valor de un atributo. Si usa la API DOM, no tiene que preocuparse por escapar en absoluto.fuente
el.textContent = str; el.innerHTML = el.innerHTML.replace(/\n/g, '<br>')
), o establecer lawhite-space
propiedad CSS enpre
opre-wrap
innerText
lugar detextContent
. Si bien es un poco más lento y tiene algunas otras diferencias al leer la propiedad, es más intuitivo ya que hace el<br>
reemplazo automáticamente cuando se le asigna.Para los usuarios de Node.JS (o usuarios que utilizan el tiempo de ejecución de Jade en el navegador), puede usar la función de escape de Jade.
No tiene sentido escribirlo usted mismo si alguien más lo está manteniendo. :)
fuente
Estoy elaborando un poco la respuesta de okw.
Puede usar las funciones DOM del navegador para eso.
Esto vuelve
<escapeThis>&
Utiliza la función estándar
createElement
para crear un elemento invisible, luego usa la funcióntextContent
para establecer cualquier cadena como su contenido y luegoinnerHTML
para obtener el contenido en su representación HTML.fuente
fuente
Espero que esto gane la carrera debido a su rendimiento y lo más importante no a una lógica encadenada usando .replace ('&', '&'). Replace ('<', '<') ...
fuente
Uno invertido:
fuente
<
y&gr;
en una cadena.To write a greater than sign in HTML type &gt;
se mostrará incorrectamente en>
lugar de>
OWASP recomienda que "[e] xcept para los caracteres alfanuméricos, [debe] escapar de todos los caracteres con valores ASCII inferiores a 256 con el
&#xHH;
formato (o una entidad con nombre si está disponible) para evitar el cambio de [un] atributo".Así que aquí hay una función que hace eso, con un ejemplo de uso:
fuente
Esta solución utiliza el código numérico de los caracteres, por ejemplo,
<
se reemplaza por<
.Aunque su rendimiento es ligeramente peor que la solución que usa un mapa , tiene las ventajas:
fuente