658 Stimmen

HTML-Zeichenfolgen mit jQuery umbrechen

Kennt jemand eine einfache Möglichkeit, HTML aus Strings in jQuery ? Ich muss in der Lage sein, eine beliebige Zeichenfolge zu übergeben und haben es richtig für die Anzeige in einer HTML-Seite (Verhinderung von JavaScript/HTML-Injection-Angriffe) escaped. Ich bin sicher, es ist möglich, jQuery zu erweitern, um dies zu tun, aber ich weiß nicht genug über das Framework im Moment, um dies zu erreichen.

0 Stimmen

Siehe auch Perf: jsperf.com/

3voto

iamandrewluca Punkte 2637

Einfaches Beispiel für JavaScript-Escaping:

function escapeHtml(text) {
    var div = document.createElement('div');
    div.innerText = text;
    return div.innerHTML;
}

escapeHtml("<script>alert('hi!');</script>")
// "&lt;script&gt;alert('hi!');&lt;/script&gt;"

3 Stimmen

Antworten, die nur auf Code basieren, werden nicht empfohlen, da sie nicht erklären, wie sie das Problem lösen. Bitte aktualisieren Sie Ihre Antwort und erklären Sie wie dies die anderen akzeptierten und hochgestimmten Antworten verbessert diese Frage bereits gestellt. Außerdem ist diese Frage 9 Jahre alt. Ihre Bemühungen würden von Nutzern, die kürzlich unbeantwortete Fragen haben, mehr geschätzt werden. Bitte überprüfen Wie schreibe ich eine gute Antwort? .

1 Stimmen

@FluffyKitten hier ist ein sehr schön geschriebener Blog-Beitrag über die Vor- und Nachteile einer solchen Funktion, der im Detail alles erklärt, was man wissen möchte :) shebang.brandonmintern.com/

0 Stimmen

@db306 Die Antwort wurde als minderwertig eingestuft, da reine Code-Antworten nicht den Stack Overflow-Richtlinien entsprechen - siehe Wie man eine gute Antwort schreibt . Mein Kommentar wurde während des Überprüfungsprozesses hinzugefügt, um zu erklären, was zur Verbesserung erforderlich ist, d. h. die Antwort muss aktualisiert werden, um zu erklären, was der Code tut und wie er die bestehenden Antworten verbessert. Die Upvotes stammen von anderen Reviewern, die dies bestätigen. Das Hinzufügen eines externen Links zu den Kommentaren entspricht immer noch nicht den SO-Richtlinien. Stattdessen muss Andrew die relevanten Informationen direkt in seine Antwort aufnehmen.

3voto

chickens Punkte 14182

ES6 Einzeiler für die Lösung aus mustache.js

const escapeHTML = str => (str+'').replace(/[&<>"'`=\/]/g, s => ({'&': '&amp;','<': '&lt;','>': '&gt;','"': '&quot;',"'": '&#39;','/': '&#x2F;','`': '&#x60;','=': '&#x3D;'})[s]);

3voto

raam86 Punkte 6549

Sie können dies leicht mit Vanilla Js tun.

Fügen Sie dem Dokument einfach einen Textknoten hinzu. Er wird vom Browser ausgeblendet.

var escaped = document.createTextNode("<HTML TO/ESCAPE/>")
document.getElementById("[PARENT_NODE]").appendChild(escaped)

3voto

Dave Brown Punkte 867

2 einfache Methoden, die KEINE JQUERY benötigen...

Sie können alle Zeichen verschlüsseln in Ihre Zeichenkette einfügen, etwa so:

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}

Oder einfach die Hauptfiguren ansprechen zu befürchten & , Zeilenumbrüche, < , > , " y ' mögen:

function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}

var myString='Encode HTML entities!\n"Safe" escape <script></'+'script> & other tags!';

test.value=encode(myString);

testing.innerHTML=encode(myString);

/*************
* \x26 is &ampersand (it has to be first),
* \x0A is newline,
*************/

<p><b>What JavaScript Generated:</b></p>

<textarea id=test rows="3" cols="55"></textarea>

<p><b>What It Renders Too In HTML:</b></p>

<div id="testing">www.WHAK.com</div>

2voto

Gheljenor Punkte 362
(function(undefined){
    var charsToReplace = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;'
    };

    var replaceReg = new RegExp("[" + Object.keys(charsToReplace).join("") + "]", "g");
    var replaceFn = function(tag){ return charsToReplace[tag] || tag; };

    var replaceRegF = function(replaceMap) {
        return (new RegExp("[" + Object.keys(charsToReplace).concat(Object.keys(replaceMap)).join("") + "]", "gi"));
    };
    var replaceFnF = function(replaceMap) {
        return function(tag){ return replaceMap[tag] || charsToReplace[tag] || tag; };
    };

    String.prototype.htmlEscape = function(replaceMap) {
        if (replaceMap === undefined) return this.replace(replaceReg, replaceFn);
        return this.replace(replaceRegF(replaceMap), replaceFnF(replaceMap));
    };
})();

Keine globalen Variablen, etwas Speicheroptimierung. Verwendung:

"some<tag>and&symbol©".htmlEscape({'©': '&copy;'})

Ergebnis ist:

"some&lt;tag&gt;and&amp;symbol&copy;"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X