¿Cómo uso jQuery para decodificar entidades HTML en una cadena?
javascript
jquery
html
EddyR
fuente
fuente
Respuestas:
En realidad, intenta
fuente
$("<div/>").html('<img src="http://www.google.com/images/logos/ps_logo2.png" onload=alert(1337)>')
. En Firefox o Safari, activa la alerta.str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g, "")
o algo similar.Sin ningún jQuery:
Esto funciona de manera similar a la respuesta aceptada , pero es seguro de usar con la entrada del usuario no confiable.
Problemas de seguridad en enfoques similares
Como señaló Mike Samuel , hacer esto con una entrada de usuario en
<div>
lugar de una<textarea>
sin confianza es una vulnerabilidad XSS, incluso si<div>
nunca se agrega al DOM:Sin embargo, este ataque no es posible contra a
<textarea>
porque no hay elementos HTML que tengan contenido permitido de a<textarea>
. En consecuencia, cualquier etiqueta HTML que todavía esté presente en la cadena 'codificada' será automáticamente codificada por el navegador.* Gracias a Eru Penkman por detectar esta vulnerabilidad.
fuente
decodedString = textArea.value;
textArea.remove();
return decodedString;
if ('remove' in Element.prototype) textArea.remove();
$("<div />").html(string).text()
ejecutará cualquier javascript en la cadena provista , lo que sospecho es lo que estaba causando su problema. La respuesta aceptada debe actualizarse a esta.Como dijo Mike Samuel, no use jQuery.html (). Text () para decodificar entidades html ya que no es seguro.
En su lugar, use un renderizador de plantillas como Moustache.js o decodeEntities del comentario de @ VyvIT.
Underscore.js biblioteca de utilidades de correa viene con
escape
yunescape
métodos, pero que no son seguros para la entrada del usuario:_.escape (cadena)
_.unescape (cadena)
fuente
unescape
en los documentos por ahora, por cierto._.unescape("'")
da como resultado solo "& # 39;" en lugar de una comilla simple. ¿Hay algo que me falta o el subrayado no se escapa a los códigos de entidad HTML como se muestra en: w3schools.com/tags/ref_entities.aspescape
y losunescape
métodos ... no son seguros para la entrada del usuario" . ¿Qué quiere decir con esto? A mí me parece una tontería, pero tal vez me estoy perdiendo algo, ¿puedes aclararlo?_.unescape("<img src=fake onerror=alert('boo!')>")
(en Chrome / FF / IE). Pero no apareció ninguna alerta. Lo probé en la consola y también lo puse en mi archivo JS. Mismo resultado.Creo que estás confundiendo los métodos de texto y HTML. Mire este ejemplo, si usa el HTML interno de un elemento como texto, obtendrá etiquetas HTML decodificadas (segundo botón). Pero si los usa como HTML, obtendrá la vista con formato HTML (primer botón).
Primer botón escribe: aquí hay un contenido HTML .
El segundo botón escribe: aquí hay un contenido <B> HTML </B>.
Por cierto, puede ver un complemento que encontré en el complemento jQuery: decodificación y codificación HTML que codifica y decodifica cadenas HTML.
fuente
La pregunta está limitada por 'con jQuery', pero podría ayudar a algunos saber que el código jQuery que figura en la mejor respuesta aquí hace lo siguiente debajo ... esto funciona con o sin jQuery:
fuente
Puede usar la biblioteca he , disponible en https://github.com/mathiasbynens/he
Ejemplo:
Me reté autor de la biblioteca sobre la cuestión de si había alguna razón para utilizar esta biblioteca en el código del lado del cliente a favor del
<textarea>
corte previsto en otras respuestas , aquí y en otros lugares. Proporcionó algunas justificaciones posibles:Si está utilizando el servidor de node.js, el uso de una biblioteca para la codificación / decodificación HTML le brinda una solución única que funciona tanto en el lado del cliente como en el servidor.
Algunos algoritmos de decodificación de entidades de los navegadores tienen errores o les falta soporte para algunas referencias de caracteres con nombre . Por ejemplo, Internet Explorer decodificará y renderizará espacios que no se rompen (
) correctamente, pero los informará como espacios ordinarios en lugar de espacios que no se rompen a través de lainnerText
propiedad de un elemento DOM , rompiendo el<textarea>
pirateo (aunque solo de una manera menor). Además, IE 8 y 9 simplemente no admiten ninguna de las nuevas referencias de caracteres con nombre agregadas en HTML 5. El autor de él también presenta una prueba de compatibilidad con referencias de caracteres con nombre en http://mathias.html5.org/tests/html / referencias-caracteres-nombrados / . En IE 8, informa más de mil errores.Si desea aislarse de los errores del navegador relacionados con la decodificación de entidades y / o poder manejar la gama completa de referencias de caracteres con nombre, no puede salirse con la suya
<textarea>
; Necesitarás una biblioteca como él .Simplemente siente que hacer las cosas de esta manera es menos hacky.
fuente
codificar:
descodificar:
fuente
Utilizar
Es más fácil hacerlo en el lado del servidor porque aparentemente JavaScript no tiene una biblioteca nativa para manejar entidades, ni encontré ninguna cerca de la parte superior de los resultados de búsqueda para los diversos marcos que extienden JavaScript.
Busque "entidades HTML JavaScript", y puede encontrar algunas bibliotecas para ese propósito, pero probablemente todas se construirán en torno a la lógica anterior: reemplazar, entidad por entidad.
fuente
Solo tenía que tener un carácter de entidad HTML (⇓) como valor para un botón HTML. El código HTML se ve bien desde el principio en el navegador:
Ahora estaba agregando una palanca que también debería mostrar el personaje. Esta es mi solucion
Esto muestra ⇓ nuevamente en el botón. Espero que esto pueda ayudar a alguien.
fuente
"Embed & Share \u21d1"
), o mejor aún, solo"Embed & Share ⇑"
si puede servir su script en UTF-8 (o UTF-16, o cualquier otra codificación que admita el carácter ⇑). El uso de un elemento DOM para analizar una entidad HTML solo para hornear un carácter unicode arbitrario en una cadena de JavaScript es un enfoque astuto y creativo que enorgullecería a Rube Goldberg, pero no es una buena práctica; los escapes de Unicode están en el lenguaje específicamente para manejar este caso de uso.Debe hacer una función personalizada para las entidades html:
fuente
Supongamos que tienes debajo de String.
Nuestras cabañas de lujo son cálidas, acogedoras y amplias; cómodo
str y asignar de nuevo a
etiqueta.
Eso es.
fuente
Para usuarios de ExtJS, si ya tiene la cadena codificada, por ejemplo, cuando el valor devuelto de una función de biblioteca es el contenido innerHTML, considere esta función ExtJS:
fuente
Extender una clase de cadena:
y usar como método:
fuente
Prueba esto :
parseHTML es una función en la biblioteca Jquery y devolverá una matriz que incluye algunos detalles sobre la cadena dada.
en algunos casos, la cadena es grande, por lo que la función separará el contenido en muchos índices.
y para obtener todos los datos de los índices, debe ir a cualquier índice y luego acceder al índice llamado "wholeText".
Elegí el índice 0 porque funcionará en todos los casos (cadena pequeña o cadena grande).
fuente
Todavía hay un problema: la cadena de escape no parece legible cuando se asigna al valor de entrada
Exapmle: https://jsfiddle.net/kjpdwmqa/3/
fuente
escape
método de Underscore.js. Tampoco hay explicación de cómo su ejemplo de código debería resolver el problema de OP.Alternativamente, también hay una biblioteca para ello.
aquí, https://cdnjs.com/libraries/he
El uso es el siguiente ...
salud.
fuente
Para decodificar entidades HTML con jQuery, solo use esta función:
Cómo utilizar:
Javascript:
HTML:
fuente
La forma más fácil es establecer un selector de clase para sus elementos y luego usar el siguiente código:
¡Nada más necesario!
Tuve este problema y encontré esta solución clara y funciona bien.
fuente
Creo que es exactamente lo contrario de la solución elegida.
fuente