J'écris une extension Chrome qui implique une grande partie du travail suivant: nettoyer les chaînes qui peuvent contenir des balises HTML, en convertissant <
, >
et &
en <
, >
et &
, respectivement.
(En d'autres termes, la même chose que PHP htmlspecialchars(str, ENT_NOQUOTES)
- je ne pense pas qu'il soit vraiment nécessaire de convertir les caractères entre guillemets.)
C'est la fonction la plus rapide que j'ai trouvée jusqu'à présent:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Mais il y a encore un gros décalage lorsque je dois exécuter quelques milliers de cordes en une seule fois.
Quelqu'un peut-il améliorer cela? C'est surtout pour les chaînes de 10 à 150 caractères, si cela fait une différence.
(Une idée que j'avais était de ne pas prendre la peine d'encoder le signe supérieur à - y aurait-il un réel danger avec cela?)
la source
Réponses:
Vous pouvez essayer de passer une fonction de rappel pour effectuer le remplacement:
Voici un test de performance: http://jsperf.com/encode-html-entities à comparer avec l'appel de la
replace
fonction à plusieurs reprises, et en utilisant la méthode DOM proposée par Dmitrij.Votre chemin semble être plus rapide ...
Pourquoi en avez-vous besoin?
la source
>
.if (/[<>&"]/.test(str) { ... }
>
est un caractère spécial en HTML, alors échappez-le. Aussi simple que cela. :)>
remplacement, cela le rendrait plus rapide.Voici une façon de procéder:
Voici une démo.
la source
La méthode de Martijn comme fonction prototype:
la source
String
cela, cela devrait être escapeHtml car ce n'est pas un échappement pour une chaîne en général. C'estString.escapeHtml
exact, maisString.escape
soulève la question, "échapper pour quoi?"Une solution encore plus rapide / plus courte est:
Ceci est lié à un vestige étrange de JavaScript dans lequel l'élément Option conserve un constructeur qui fait ce genre d'échappatoire automatiquement.
Crédit à https://github.com/jasonmoo/t.js/blob/master/t.js
la source
Le code source AngularJS a également une version à l'intérieur de angular-sanitize.js .
la source
La méthode la plus rapide est:
Cette méthode est environ deux fois plus rapide que les méthodes basées sur «replace», voir http://jsperf.com/htmlencoderegex/35 .
Source: https://stackoverflow.com/a/17546215/698168
la source
Script tout-en-un:
http://pastebin.com/JGCVs0Ts
la source
la source
Je ne suis pas tout à fait sûr de la vitesse, mais si vous recherchez la simplicité, je suggérerais d'utiliser la fonction d' échappement lodash / underscore .
la source
La méthode de Martijn en tant que fonction unique avec gestion de la marque " ( utilisation en javascript ):
la source
Je vais ajouter
XMLSerializer
à la pile. Il fournit le résultat le plus rapide sans utiliser de mise en cache d'objets (ni sur le sérialiseur, ni sur le nœud Texte).L'avantage supplémentaire est qu'il prend en charge les attributs qui sont sérialisés différemment des nœuds de texte:
Vous pouvez voir ce qu'il remplace réellement en vérifiant la spécification, à la fois pour les nœuds de texte et pour les valeurs d'attribut . La documentation complète a plus de types de nœuds, mais le concept est le même.
En ce qui concerne les performances, c'est le plus rapide lorsqu'il n'est pas mis en cache. Lorsque vous autorisez la mise en cache, l'appel
innerHTML
à un HTMLElement avec un nœud Text enfant est le plus rapide. Regex serait le plus lent (comme le prouvent d'autres commentaires). Bien sûr, XMLSerializer pourrait être plus rapide sur d'autres navigateurs, mais dans mes tests (limités), ainnerHTML
est le plus rapide.Ligne unique la plus rapide:
new XMLSerializer().serializeToString(document.createTextNode(text));
Le plus rapide avec la mise en cache:
https://jsperf.com/htmlentityencode/1
la source
Un peu tard pour le spectacle, mais quel est le problème avec l'utilisation d' encodeURIComponent () et decodeURIComponent () ?
la source