Ich schreibe eine Chrome - Erweiterung , die eine beinhaltet dabei viel von dem folgenden Job: Hygienisierung Zeichenfolge , die möglicherweise HTML - Tags enthalten, durch die Umwandlung <
, >
und &
zu <
, >
und &
sind.
(Mit anderen Worten, genau wie bei PHP htmlspecialchars(str, ENT_NOQUOTES)
- ich glaube nicht, dass es wirklich notwendig ist, doppelte Anführungszeichen zu konvertieren.)
Dies ist die schnellste Funktion, die ich bisher gefunden habe:
function safe_tags(str) {
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>') ;
}
Aber es gibt immer noch eine große Verzögerung, wenn ich ein paar tausend Saiten auf einmal durchlaufen muss.
Kann jemand das verbessern? Es ist meistens für Zeichenfolgen zwischen 10 und 150 Zeichen, wenn das einen Unterschied macht.
(Eine Idee, die ich hatte, war, sich nicht die Mühe zu machen, das Größer-als-Zeichen zu verschlüsseln - würde das eine echte Gefahr darstellen?)
quelle
Antworten:
Sie können versuchen, eine Rückruffunktion zu übergeben, um den Austausch durchzuführen:
Hier ist ein Leistungstest: http://jsperf.com/encode-html-entities zum Vergleich mit dem
replace
wiederholten Aufrufen der Funktion und der Verwendung der von Dmitrij vorgeschlagenen DOM-Methode.Dein Weg scheint schneller zu sein ...
Warum brauchst du es aber?
quelle
>
.if (/[<>&"]/.test(str) { ... }
>
ist ein Sonderzeichen in HTML, also entkommen Sie ihm. So einfach ist das. :)>
Austausch zu überspringen , würde dies ihn schneller machen.Hier ist eine Möglichkeit, wie Sie dies tun können:
Hier ist eine Demo.
quelle
Martijns Methode als Prototypfunktion:
quelle
String
like this sollte es EscapeHtml sein, da es im Allgemeinen kein Escape für einen String ist. Das istString.escapeHtml
richtig,String.escape
wirft aber die Frage auf: "Flucht für was?"Der AngularJS-Quellcode enthält auch eine Version in angular-sanitize.js .
quelle
Die schnellste Methode ist:
Diese Methode ist ungefähr doppelt so schnell wie die auf 'Ersetzen' basierenden Methoden, siehe http://jsperf.com/htmlencoderegex/35 .
Quelle: https://stackoverflow.com/a/17546215/698168
quelle
Eine noch schnellere / kürzere Lösung ist:
Dies hängt mit einem seltsamen Überbleibsel von JavaScript zusammen, bei dem das Option-Element einen Konstruktor behält, der diese Art der automatischen Escape-Funktion ausführt.
Gutschrift an https://github.com/jasonmoo/t.js/blob/master/t.js
quelle
All-in-One-Skript:
http://pastebin.com/JGCVs0Ts
quelle
quelle
Bei der Geschwindigkeit bin ich mir nicht ganz sicher, aber wenn Sie nach Einfachheit suchen, würde ich die Verwendung der Lodash / Underscore- Escape- Funktion empfehlen .
quelle
Martijns Methode als Einzelfunktion mit Handhabung " mark " ( in Javascript ):
quelle
Ich werde
XMLSerializer
den Stapel hinzufügen . Es liefert das schnellste Ergebnis ohne Objekt-Caching (weder auf dem Serializer noch auf dem Textknoten).Der zusätzliche Bonus besteht darin, dass Attribute unterstützt werden, die anders als Textknoten serialisiert sind:
Sie können sehen, was tatsächlich ersetzt wird, indem Sie die Spezifikation sowohl für Textknoten als auch für Attributwerte überprüfen . Die vollständige Dokumentation enthält mehr Knotentypen, das Konzept ist jedoch dasselbe.
Die Leistung ist am schnellsten, wenn sie nicht zwischengespeichert wird. Wenn Sie das Caching zulassen, ist das Aufrufen
innerHTML
eines HTMLElement mit einem untergeordneten Textknoten am schnellsten. Regex wäre am langsamsten (wie aus anderen Kommentaren hervorgeht). Natürlich könnte XMLSerializer in anderen Browsern schneller sein, aber in meinen (eingeschränkten) Tests ist ainnerHTML
am schnellsten.Schnellste einzelne Zeile:
new XMLSerializer().serializeToString(document.createTextNode(text));
Am schnellsten mit Caching:
https://jsperf.com/htmlentityencode/1
quelle
Ein bisschen spät zur Show, aber was ist falsch daran, encodeURIComponent () und decodeURIComponent () zu verwenden ?
quelle