HTML - Codierung ist einfach zu ersetzen &
, "
, '
, <
und >
Zeichen mit ihrer Einheit Äquivalente. Reihenfolge ist wichtig, wenn Sie die &
Zeichen nicht zuerst ersetzen , werden Sie einige der Entitäten doppelt codieren:
if (!String.prototype.encodeHTML) {
String.prototype.encodeHTML = function () {
return this.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
}
Als @Johan BW de Vries darauf hingewiesen, das mit den Tag - Namen haben Fragen werden, möchte ich klarstellen , dass ich die Annahme gemacht , dass dies für die benutzt wurde, um value
nur
Umgekehrt, wenn Sie HTML-Entitäten 1 dekodieren möchten , stellen Sie sicher, dass Sie nach allem anderen dekodieren &
, &
damit Sie keine Entitäten doppelt dekodieren:
if (!String.prototype.decodeHTML) {
String.prototype.decodeHTML = function () {
return this.replace(/'/g, "'")
.replace(/"/g, '"')
.replace(/>/g, '>')
.replace(/</g, '<')
.replace(/&/g, '&');
};
}
1 nur die Grundlagen, nicht ©
zu ©
oder andere solche Dinge
Soweit Bibliotheken betroffen sind. Underscore.js (oder Lodash, wenn Sie es vorziehen) bietet eine _.escape
Methode zum Ausführen dieser Funktionalität.
.replace()
. In beiden Fällen müssten Sie über eine große Datenmenge verfügen, um signifikante Probleme zu erkennen. Eine schnellere Alternative wäre, Ihre App zu vergleichen und den tatsächlichen Choke-Punkt (normalerweise verschachtelte Schleifen) zu finden, anstatt sich über etwas so Vernachlässigbares wie dieses Gedanken zu machen.Dies könnte bei gleichem Ergebnis etwas effizienter sein:
function escapeXml(unsafe) { return unsafe.replace(/[<>&'"]/g, function (c) { switch (c) { case '<': return '<'; case '>': return '>'; case '&': return '&'; case '\'': return '''; case '"': return '"'; } }); }
quelle
Wenn Sie jQuery haben, ist hier eine einfache Lösung:
String.prototype.htmlEscape = function() { return $('<div/>').text(this.toString()).html(); };
Verwenden Sie es so:
"<foo&bar>".htmlEscape();
->"<foo&bar>"
quelle
$('<div/>').text('<&\'>"').html()
->"<&'>""
Sie können die folgende Methode verwenden. Ich habe dies im Prototyp hinzugefügt, um den Zugriff zu erleichtern. Ich habe auch negative Vorausschau verwendet, damit es die Dinge nicht durcheinander bringt, wenn Sie die Methode zweimal oder öfter aufrufen.
Verwendung:
var original = "Hi&there"; var escaped = original.EncodeXMLEscapeChars(); //Hi&there
Die Dekodierung erfolgt automatisch im XML-Parser.
Methode :
//String Extenstion to format string for xml content. //Replces xml escape chracters to their equivalent html notation. String.prototype.EncodeXMLEscapeChars = function () { var OutPut = this; if ($.trim(OutPut) != "") { OutPut = OutPut.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); OutPut = OutPut.replace(/&(?!(amp;)|(lt;)|(gt;)|(quot;)|(#39;)|(apos;))/g, "&"); OutPut = OutPut.replace(/([^\\])((\\\\)*)\\(?![\\/{])/g, "$1\\\\$2"); //replaces odd backslash(\\) with even. } else { OutPut = ""; } return OutPut; };
quelle
let a = 'foo'
sind diese Codes betroffen. Erstellen Sie besser eine Hilfsfunktion, anstatt den Prototyp zu erweitern.Ich habe ursprünglich die akzeptierte Antwort im Produktionscode verwendet und festgestellt, dass sie bei starker Verwendung tatsächlich sehr langsam ist. Hier ist eine viel schnellere Lösung (läuft mit mehr als der doppelten Geschwindigkeit):
var escapeXml = (function() { var doc = document.implementation.createDocument("", "", null) var el = doc.createElement("temp"); el.textContent = "temp"; el = el.firstChild; var ser = new XMLSerializer(); return function(text) { el.nodeValue = text; return ser.serializeToString(el); }; })(); console.log(escapeXml("<>&")); //<>&
quelle
document
Objekt haben. Ich habe es nichtVielleicht kannst du das versuchen,
function encodeXML(s) { const dom = document.createElement('div') dom.textContent = s return dom.innerHTML }
Referenz
quelle
Achtung, alle Regexing ist nicht gut, wenn Sie XML in XML haben.
Durchlaufen Sie stattdessen die Zeichenfolge einmal und ersetzen Sie alle Escape-Zeichen.
Auf diese Weise können Sie denselben Charakter nicht zweimal überfahren.
function _xmlAttributeEscape(inputString) { var output = []; for (var i = 0; i < inputString.length; ++i) { switch (inputString[i]) { case '&': output.push("&"); break; case '"': output.push("""); break; case "<": output.push("<"); break; case ">": output.push(">"); break; default: output.push(inputString[i]); } } return output.join(""); }
quelle
Technisch gesehen sind &, <und> keine gültigen XML-Entitätsnamenzeichen. Wenn Sie der Schlüsselvariablen nicht vertrauen können, sollten Sie sie herausfiltern.
Wenn Sie möchten, dass sie als HTML-Entitäten maskiert werden, können Sie beispielsweise http://www.strictly-software.com/htmlencode verwenden .
quelle
Wenn etwas zuvor entkommen ist, können Sie dies versuchen, da dies nicht wie bei vielen anderen doppelt entkommt
function escape(text) { return String(text).replace(/(['"<>&'])(\w+;)?/g, (match, char, escaped) => { if(escaped) return match switch(char) { case '\'': return '"' case '"': return ''' case '<': return '<' case '>': return '>' case '&': return '&' } }) }
quelle
Das ist einfach:
sText = ("" + sText).split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'");
quelle