Tengo cuerdas como
var str = 'One & two & three';
renderizado en HTML por el servidor web. Necesito transformar esas cadenas en
'One & two & three'
Actualmente, eso es lo que estoy haciendo (con la ayuda de jQuery):
$(document.createElement('div')).html('{{ driver.person.name }}').text()
Sin embargo, tengo la inquietante sensación de que lo estoy haciendo mal. Yo he tratado
unescape("&")
pero no parece funcionar, tampoco decodeURI / decodeURIComponent.
¿Hay alguna otra forma más nativa y elegante de hacerlo?
javascript
html
text
decode
Arte
fuente
fuente
escape
o URI , esas funciones no funcionarán.𝕫
. Este es un problema con una especificación en evolución; como tal, debe elegir una herramienta que realmente se esté manteniendo para resolverlo.Respuestas:
Una opción más moderna para interpretar HTML (texto y otros) desde JavaScript es el soporte HTML en la
DOMParser
API ( ver aquí en MDN ). Esto le permite utilizar el analizador HTML nativo del navegador para convertir una cadena en un documento HTML. Ha sido compatible con las nuevas versiones de todos los principales navegadores desde finales de 2014.Si solo queremos decodificar algún contenido de texto, podemos ponerlo como el único contenido en el cuerpo de un documento, analizar el documento y extraerlo
.body.textContent
.Podemos ver en el borrador de la especificación
DOMParser
que JavaScript no está habilitado para el documento analizado, por lo que podemos realizar esta conversión de texto sin problemas de seguridad.Está más allá del alcance de esta pregunta, pero tenga en cuenta que si toma los nodos DOM analizados (no solo su contenido de texto) y los mueve al DOM del documento en vivo, es posible que sus scripts se vuelvan a habilitar, y podría Ser preocupaciones de seguridad. No lo he investigado, así que tenga cuidado.
fuente
¿Necesita decodificar todas las entidades HTML codificadas o solo a
&
sí mismo?Si solo necesita manejar
&
, puede hacer esto:Si necesita decodificar todas las entidades HTML, puede hacerlo sin jQuery:
Tome nota de los comentarios de Mark a continuación que destacan los agujeros de seguridad en una versión anterior de esta respuesta y recomiendan usar en
textarea
lugar dediv
mitigar las posibles vulnerabilidades de XSS. Estas vulnerabilidades existen si usa jQuery o JavaScript simple.fuente
encoded='<img src="bla" onerror="alert(1)">'
entonces el fragmento de arriba mostrará una alerta. Esto significa que si su texto codificado proviene de la entrada del usuario, decodificarlo con este fragmento puede presentar una vulnerabilidad XSS.null
después de recibir el texto, no se activaalert(1)
todavía me funciona en Chrome en OS X. Si desea una variante segura de este truco, intente usar atextarea
.Matthias Bynens tiene una biblioteca para esto: https://github.com/mathiasbynens/he
Ejemplo:
Sugiero favorecerlo sobre los hacks que implican configurar el contenido HTML de un elemento y luego volver a leer su contenido de texto. Dichos enfoques pueden funcionar, pero son engañosamente peligrosos y presentan oportunidades XSS si se utilizan en entradas de usuarios no confiables.
Si realmente no puede soportar cargar en una biblioteca, puede usar el
textarea
truco descrito en esta respuesta a una pregunta casi duplicada, que, a diferencia de varios enfoques similares que se han sugerido, no tiene agujeros de seguridad que conozca:¡Pero tome nota de los problemas de seguridad, que afectan enfoques similares a este, que enumero en la respuesta vinculada! Este enfoque es un truco, y los cambios futuros en el contenido permitido de un
textarea
(o errores en navegadores particulares) podrían conducir a un código que depende de que de repente tenga un agujero XSS algún día.fuente
he
es absolutamente genial! Muchas gracias por la recomendación!Esto es del código fuente ExtJS.
fuente
htmlEnDecode.htmlDecode('€')
debería regresar'€'
, pero en cambio regresa'€'
.element.innerText
También hace el truco.fuente
Puede usar la función de escape / escape de Lodash https://lodash.com/docs/4.17.5#unescape
str se convertirá
'fred, barney, & pebbles'
fuente
En caso de que lo esté buscando, como yo, mientras tanto, hay un método JQuery agradable y seguro.
https://api.jquery.com/jquery.parsehtml/
Puedes f.ex. escribe esto en tu consola:
Entonces $ .parseHTML (x) devuelve una matriz, y si tiene un marcado HTML dentro de su texto, la longitud de la matriz será mayor que 1.
fuente
x
tiene un valor de<script>alert('hello');</script>
lo anterior se bloqueará. En jQuery actual, en realidad no intentará ejecutar el script, pero[0]
cederá,undefined
por lo que la llamadatextContent
fallará y su script se detendrá allí.$('<div />').html(x).text();
parece más seguro - a través de gist.github.com/jmblog/3222899jQuery codificará y decodificará por usted. Sin embargo, debe usar una etiqueta textarea, no un div.
fuente
.html()
. Por lo tanto, incluso usar untextarea
no es suficiente para garantizar la seguridad aquí; Sugiero no usar jQuery para esta tarea y escribir código equivalente con la API DOM simple . (Sí, ese viejo comportamiento de jQuery es loco y horrible.)Primero crea un
<span id="decodeIt" style="display:none;"></span>
lugar en el cuerpoA continuación, asigne la cadena que se decodificará como innerHTML a esto:
Finalmente,
Aquí está el código general:
fuente
stringtodecode
contiene algo como<script>alert(1)</script>
.Una solución de JavaScript que atrapa los más comunes:
Este es el reverso de https://stackoverflow.com/a/4835406/2738039
fuente
map[c] || ''
no reconocidos no se mostrará comoundefined
unescapeHtml(str){ var map = {amp: '&', lt: '<', le: '≤', gt: '>', ge: '≥', quot: '"', '#039': "'"} return str.replace(/&([^;]+);/g, (m, c) => map[c]|| '') }
Para chicos de una línea:
fuente
La pregunta no especifica el origen de,
x
pero tiene sentido defender, si podemos, contra entradas maliciosas (o simplemente inesperadas, desde nuestra propia aplicación). Por ejemplo, supongamos quex
tiene un valor de& <script>alert('hello');</script>
. Una forma segura y sencilla de manejar esto en jQuery es:Encontrado a través de https://gist.github.com/jmblog/3222899 . No puedo ver muchas razones para evitar usar esta solución dado que es al menos tan corta, si no más corta que algunas alternativas y proporciona defensa contra XSS.
(Originalmente publiqué esto como un comentario, pero lo agrego como respuesta, ya que un comentario posterior en el mismo hilo solicitó que lo hiciera).
fuente
Intenté todo para eliminar & de una matriz JSON. Ninguno de los ejemplos anteriores, pero https://stackoverflow.com/users/2030321/chris dio una gran solución que me llevó a solucionar mi problema.
No lo usé, porque no entendía cómo insertarlo en una ventana modal que extraía datos JSON en una matriz, pero lo intenté en función del ejemplo, y funcionó:
Me gusta porque era simple y funciona, pero no estoy seguro de por qué no se usa ampliamente. Busqué hola y bajo para encontrar una solución simple. Sigo buscando la comprensión de la sintaxis y si existe algún riesgo de usarla. No he encontrado nada todavía.
fuente