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/

18voto

NicolasBernier Punkte 1548

escape() y unescape() sind für die Kodierung/Dekodierung von Zeichenketten für URLs gedacht, nicht für HTML.

Eigentlich verwende ich das folgende Snippet, um den Trick zu machen, der kein Framework benötigt:

var escapedHtml = html.replace(/&/g, '&')
                      .replace(/>/g, '>')
                      .replace(/</g, '&lt;')
                      .replace(/"/g, '&quot;')
                      .replace(/'/g, '&apos;');

0 Stimmen

Wenn Sie eine " s, dann müssen Sie mindestens Folgendes hinzufügen ' und `` ins Getümmel. Diese werden eigentlich nur für String-Tag-Daten innerhalb von HTML-Elementen benötigt. Für html-Daten selbst (außerhalb von Tags) sind nur die ersten 3 erforderlich.

15voto

Jeena Punkte 2112

Ich habe das mustache.js-Beispiel erweitert, indem ich die escapeHTML() Methode auf das String-Objekt.

var __entityMap = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    '"': '&quot;',
    "'": '&#39;',
    "/": '&#x2F;'
};

String.prototype.escapeHTML = function() {
    return String(this).replace(/[&<>"'\/]/g, function (s) {
        return __entityMap[s];
    });
}

Auf diese Weise ist es ganz einfach zu benutzen "Some <text>, more Text&Text".escapeHTML()

0 Stimmen

Nützlich, aber ich bin auch umgezogen __entityMap in den lokalen Bereich der Funktion. Und das alles verpackt in if (typeof String.prototype.escapeHTML !== 'function'){...}

11voto

ronnbot Punkte 1181

Wenn Sie underscore.js haben, verwenden Sie _.escape (effizienter als die oben beschriebene jQuery-Methode):

_.escape('Curly, Larry & Moe'); // returns: Curly, Larry &amp; Moe

5voto

amrp Punkte 59

Dies ist ein schönes, sicheres Beispiel...

function escapeHtml(str) {
    if (typeof(str) == "string"){
        try{
            var newStr = "";
            var nextCode = 0;
            for (var i = 0;i < str.length;i++){
                nextCode = str.charCodeAt(i);
                if (nextCode > 0 && nextCode < 128){
                    newStr += "&#"+nextCode+";";
                }
                else{
                    newStr += "?";
                }
             }
             return newStr;
        }
        catch(err){
        }
    }
    else{
        return str;
    }
}

4 Stimmen

Welche Arten von Ausnahmen unterdrücken Sie dort?

5voto

Wayne Punkte 501

Wenn Sie die Regex-Route gehen, gibt es einen Fehler in tghw's Beispiel oben.

<!-- WON'T WORK -  item[0] is an index, not an item -->

var escaped = html; 
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g,"&gt;"], [/"/g,
"&quot;"]]

for(var item in findReplace) {
     escaped = escaped.replace(item[0], item[1]);   
}

<!-- WORKS - findReplace[item[]] correctly references contents -->

var escaped = html;
var findReplace = [[/&/g, "&amp;"], [/</g, "&lt;"], [/>/g, "&gt;"], [/"/g, "&quot;"]]

for(var item in findReplace) {
     escaped = escaped.replace(findReplace[item[0]], findReplace[item[1]]);
}

2 Stimmen

Ich glaube, es sollte for(var item in findReplace) { escaped = escaped.replace(findReplace[item][0], findReplace[item][1]); } sein.

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