Décoder & retour & en JavaScript
J'ai des chaînes de caractères comme
var str = 'One & two & three';
rendu en HTML par le serveur web. J'ai besoin de transformer ces chaînes en
'One & two & three'
Actuellement, c'est ce que je suis en train de faire (avec l'aide de jQuery):
$(document.createElement('div')).html('{{ driver.person.name }}').text()
Mais j'ai un sentiment troublant que je me suis fais mal.
J'ai essayé
unescape("&")
mais il ne semble pas fonctionner, ni ne decodeURI/decodeURIComponent.
Existe d'autres, plus naturel et élégant moyens de le faire?
- L'énorme fonction incluse dans cet article semble bien fonctionner: blogs.msdn.com/b/aoakley/archive/2003/11/12/49645.aspx je ne pense pas que c'est le plus intelligent de la solution, mais fonctionne.
- Comme des chaînes de caractères contenant des entités HTML sont quelque chose de différent de
escape
d ou URI chaînes codées, ces fonctions ne fonctionnent pas. - notez que les nouvelles entités nommées ont été ajoutés à HTML (par exemple via l'HTML 5 spec) car cette fonction a été créé en 2003 par exemple, il ne reconnaît pas
𝕫
. C'est un problème à l'évolution de la spec; en tant que tel, vous devez choisir un outil qui est maintenu à résoudre avec. - oui, je suis totalement d'accord! C'est une belle expérience pour en revenir à cette question après une couple d'années, merci!
Vous devez vous connecter pour publier un commentaire.
Une option plus moderne pour interpréter le HTML (texte ou autre) à partir de JavaScript est le support HTML dans le
DOMParser
API (voir ici dans MDN). Cela vous permet d'utiliser le navigateur natif de l'analyseur HTML pour convertir une chaîne de caractères d'un document HTML. Il a été pris en charge dans les nouvelles versions de tous les navigateurs majeurs depuis la fin de 2014.Si nous voulons juste à décoder certains contenu du texte, on peut le placer comme le seul contenu dans un document de corps, d'analyser le document, et de sortir le son
.body.textContent
.JS:
Nous pouvons le voir dans le projet de spécification pour
DOMParser
que JavaScript n'est pas activé pour le document analysé, afin que nous puissions effectuer cette conversion du texte sans soucis de sécurité.C'est au-delà de la portée de cette question, mais veuillez noter que si vous prenez l'analyse nœuds eux-mêmes (et pas seulement de leur contenu texte) et en les déplaçant vers le document DOM, il est possible que leur script serait réactivé, et il pourrait y avoir des préoccupations en matière de sécurité. Je n'ai pas fait des recherches, merci donc de faire preuve de prudence.
Avez-vous besoin de décoder tous encodés en entités HTML ou tout simplement
&
lui-même?Si vous avez seulement besoin de gérer
&
ensuite, vous pouvez faire ceci:Si vous avez besoin de décoder toutes les entités HTML, alors vous pouvez le faire sans jQuery:
Veuillez prendre note de la Marque les commentaires ci-dessous qui mettent en évidence les failles de sécurité dans une version antérieure de cette réponse et de recommander à l'aide de
textarea
plutôt quediv
afin d'atténuer les effets potentiels de failles XSS. Ces vulnérabilités existent si vous utilisez jQuery ou de la plaine JavaScript.encoded='<img src="bla" onerror="alert(1)">'
puis l'extrait de code ci-dessus va afficher un message d'alerte. Cela signifie que si votre texte codé est à venir à partir de la saisie de l'utilisateur, du décodage avec cet extrait peut présenter une vulnérabilité XSS.null
après l'obtention de texte, l'alerte dans l'img n'est pas tiré - jsfiddle.net/Mottie/gaBeb/128alert(1)
encore des incendies pour moi sur Chrome OS X. Si vous souhaitez un coffre-fort variante de ce hack, essayez de à l'aide d'untextarea
.Matthias Bynens dispose d'une bibliothèque pour cela: https://github.com/mathiasbynens/he
Exemple:
Je suggère favorisant plus de hacks avec le réglage d'un élément de contenu HTML, puis la lecture de son texte contenu. De telles approches peuvent travailler, mais qui sont faussement dangereux et de présenter XSS possibilités si elle est utilisée sur les autres entrées de l'utilisateur.
Si vous ne pouvez vraiment pas supporter de les charger dans une bibliothèque, vous pouvez utiliser le
textarea
hack décrit dans cette réponse à un quasi-double question, qui, contrairement à de nombreux autres approches qui ont été proposées, n'a pas de trous de sécurité que je connais:Mais de prendre note des questions de sécurité, affectant des approches similaires à celui-ci, que je liste dans la réponse! Cette approche est un hack, et les modifications futures de la teneur admissible d'un
textarea
(ou de bugs, en particulier les navigateurs) pourrait conduire à un code qui s'appuie sur elle tout à coup avoir une XSS trou un jour.he
est absolument génial! Merci beaucoup pour la recommandation!C'est à partir de ExtJS code source.
htmlEnDecode.htmlDecode('€')
doit retourner'€'
, mais au lieu de cela renvoie'€'
.element.innerText
également fait le tour.Dans le cas où vous êtes à la recherche pour elle, comme moi, pendant ce temps il y a un bon et méthode JQuery.
https://api.jquery.com/jquery.parsehtml/
Vous pouvez f.ex. tapez ceci dans la console:
Donc $.parseHTML(x) retourne un tableau, et si vous avez des balises HTML dans votre texte, le tableau.longueur doit être supérieure à 1.
Vous pouvez utiliser Lodash ne pas encoder /fonction d'échappement https://lodash.com/docs/4.17.5#unescape
str deviendra
'fred, barney, & pebbles'
jQuery pour encoder et décoder pour vous. Cependant, vous devez utiliser une balise textarea, pas un div.
JS:
HTML:
.html()
. Ainsi, même à l'aide d'untextarea
n'est pas suffisant pour assurer la sécurité ici, je propose ne pas utiliser jQuery pour cette tâche et de l'écriture de code équivalent avec la plaine API DOM. (Oui, ce vieux comportement par jQuery est folle et terrible.)D'abord créer un
<span id="decodeIt" style="display:none;"></span>
quelque part dans le corpsEnsuite, attribuer la chaîne pour être décodé comme innerHTML à ceci:
Enfin,
Voici le code global:
stringtodecode
contient quelque chose comme<script>alert(1)</script>
.Pour une ligne de gars:
une solution d'activer javascript qui attrape la commune:
c'est l'inverse de https://stackoverflow.com/a/4835406/2738039
map[c] || ''
méconnu de ceux n'apparaît pas commeundefined
unescapeHtml(str){ var map = {amp: '&', lt: '<', le: '≤', gt: '>', ge: '≥', quot: '"', '#039': "'"} return str.replace(/&([^;]+);/g, (m, c) => map[c]|| '') }
J'ai tout essayé pour supprimer & à partir d'un tableau JSON. Aucun des exemples ci-dessus, mais https://stackoverflow.com/users/2030321/chris a donné une excellente solution qui m'a conduit à résoudre mon problème.
Je n'ai pas utiliser, parce que je ne comprends pas comment l'insérer dans une fenêtre modale qui tirait les données JSON dans un tableau, mais je l'ai fait essayer cette base sur l'exemple, et cela a fonctionné:
Je l'aime parce que c'était simple, et ça fonctionne, mais vous ne savez pas pourquoi il n'est pas largement utilisé. Recherché hi & faible à trouver une solution simple.
Je continue à rechercher la compréhension de la syntaxe, et si il n'y a aucun risque à l'utiliser. Je n'ai rien trouvé encore.