3 Stimmen

Wie kann man eine JS-String-Variable sicher in doppelte Anführungszeichen einpacken?

Wenn Sie selbst ein Zeichenfolgenliteral erstellen, müssen Sie die doppelten Anführungszeichen natürlich selbst mit einem Backslash entschlüsseln.

var foo = "baz\"bat";

Das gilt auch für die wenigen anderen Steuerzeichen wie Zeilenumbrüche und Backslashes.

var bar = "baz\\bat\nmynew line and a \"quote\" ";

aber wenn Sie die vorhandene Variable nur in Anführungszeichen einpacken, um sie z.B. an ein anderes System zu übergeben, das Eingaben in Anführungszeichen verlangt, gibt es einige Verwirrung.

Natürlich müssen Sie alle potenziellen doppelten Anführungszeichen in der Zeichenkette entfernen.

var doubleQuoteRe = /\"/g;
var quoted = "\"" + unquoted.replace(escaper, '\\\"') + "\"";

Aber nach Meinung einiger auch müssen sich nun darum kümmern, dass wörtliche Backslash-Zeichen in der Variable nicht mehr vorkommen. Mit anderen Worten: ein viel größerer Hammer als meine kleine Regex. Allerdings sehe ich nicht, warum.

3voto

kennebec Punkte 98551

Sie sollten es vermeiden, Anführungszeichen zu escapen, die Sie bereits escapen.

String.prototype.inquotes=function(){
 return '"'+this.replace(/(^|[^\\])"/g,'$1\\"')+'"';
}

1voto

nmealy Punkte 161

Die Antwort lautet: Ja, Sie müssen zwei Dinge tun:

  1. literalisierte Backslash-Zeichen in der Zeichenkette durch zwei Backslashes ersetzen,
  2. DANN fahren Sie fort, indem Sie alle Vorkommen von " durch \" ersetzen.

Die einfachste Erklärung, warum Schritt 1 unerlässlich ist, ist die 5-Zeichen-Zeichenkette :

foo\"   

Nach den ersten 3 Zeichen (foo) folgt ein buchstäblicher Backslash in der Zeichenkette und dann ein buchstäbliches Anführungszeichen.

(Anders ausgedrückt, als String-Literal würde dies wie "foo\"" aussehen)

Wenn ich nur das Anführungszeichen ersetzen würde, hätte ich am Ende eine Zeichenkette in Anführungszeichen, deren Wert

foo\\"     

Aber die zwei Backslashes hier werden als ein einzelner Backslash interpretiert. Wenn ich diesen Wert also in Anführungszeichen einpacke, erhalte ich unausgewogene Anführungszeichen.

"foo\\""

Wenn ich dagegen zuerst Schritt 1 ausführe - alle Backslashes durch doppelte Backslashes ersetzen - ergibt sich

foo\\"

und dann Schritt 2 - das Ersetzen des Anführungszeichens durch slash-quote ergibt

foo\\\"

Wenn ich nun meinen Wert in Anführungszeichen einpacke, erhalte ich schließlich

"foo\\\""

was korrekt ist.

1voto

pablo Punkte 2621

Es gibt eine nicht standardmäßige str.quote() in FF

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/quote Sie schlagen das folgende Polyfill vor

    if(!String.prototype.quote){
  // oop version - no dependencies
  String.prototype.quote = (function(){
    // prepare fallback
    // ----------------
    // backslash escape double quotes and backslashes
    var escp_regex = /[\\"]/g,
      escp_callback = '\\$&',
      // escape control characters
      ctrl_map = {
        '\b': '\\b', // backspace
        '\t': '\\t', // tab
        '\n': '\\n', // new line
        '\f': '\\f', // form feed
        '\r': '\\r'  // carriage return
      },
      // don't rely on `Object.keys(ctrl_map).join('')`
      ctrl_regex = new RegExp('[\b\t\n\f\r]', 'g'),
      ctrl_callback = function(match){
        return ctrl_map[match];
      },
      // hex-escape, spare out control characters and ASCII printables
      // [0-7,11,14-31,127-255]
      xhex_regex = /[\x00-\x07\x0B\x0E-\x1F\x7F-\xFF]/g,
      xhex_callback = function(match, char_code){
        char_code = match.charCodeAt(0);
        return '\\x' + (char_code < 16 ? '0' : '') + char_code;
      },
      // hex-escape all others
      uhex_regex = /[\u0100-\uFFFF]/g,
      uhex_callback = function(match, char_code){
        char_code = match.charCodeAt(0);
        return '\\u' + (char_code < 4096 ? '0' : '') + char_code;
      },
      // delegate to native `JSON.stringify` if available
      stringify = typeof JSON !== 'undefined' && JSON.stringify;

    // return actual polyfill
    // ----------------------
    return function(){
      var self = this; // promote compression
      if(self == null) throw new TypeError('can\'t convert ' + self + ' to object');
      if(stringify) return stringify(self);
      return '"' + self
        .replace(escp_regex, escp_callback)
        .replace(ctrl_regex, ctrl_callback)
        .replace(xhex_regex, xhex_callback)
        .replace(uhex_regex, uhex_callback) + '"';
    }
  }());

  // generic version - requires Function#bind
  String.quote = Function.call.bind(''.quote);
}

0voto

Christoph Punkte 157217

Möglicherweise möchten Sie neben Anführungszeichen auch andere Zeichen vermeiden, z. B. Leerzeichen (Zeilenumbrüche!) und/oder Nicht-ASCII-Zeichen. Es gibt Crockford's quote() und meine eigene Implementierung finden Sie unter mercurial.intuxication.org .

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