Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在双引号字符中安全地包装JS字符串变量?_Javascript_Regex_Double Quotes - Fatal编程技术网

Javascript 如何在双引号字符中安全地包装JS字符串变量?

Javascript 如何在双引号字符中安全地包装JS字符串变量?,javascript,regex,double-quotes,Javascript,Regex,Double Quotes,显然,当您自己创建一个实际的字符串文字时,您自己会对双引号字符进行反斜杠转义 var foo = "baz\"bat"; 就像处理其他一些控制字符一样,如换行符和反斜杠 var bar = "baz\\bat\nmynew line and a \"quote\" "; 但如果您只是将现有变量包装为引号字符,即将其提供给需要引号输入的其他系统,则会出现一些混乱 显然,您必须转义字符串中任何潜在的双引号字符 var doubleQuoteRe = /\"/g; var quoted = "\"

显然,当您自己创建一个实际的字符串文字时,您自己会对双引号字符进行反斜杠转义

var foo = "baz\"bat";
就像处理其他一些控制字符一样,如换行符和反斜杠

var bar = "baz\\bat\nmynew line and a \"quote\" ";
但如果您只是将现有变量包装为引号字符,即将其提供给需要引号输入的其他系统,则会出现一些混乱

显然,您必须转义字符串中任何潜在的双引号字符

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

但根据一些人的说法,您现在还必须担心如何转义变量中的文字反斜杠字符。换句话说,使用比我的小正则表达式大得多的锤子。但是我不明白为什么

您可能希望转义引号以外的其他字符,例如空格字符(换行符!)和/或非ASCII字符。有,我自己的实现可以在上找到。

答案是肯定的,您必须做两件事:

  • 将字符串中的文字反斜杠字符替换为两个反斜杠
  • 然后,继续将出现的任何“替换为\”

    为什么步骤1是最基本的解释是考虑5字符字符串:

    foo\"   
    
    在前3个字符(foo)之后,字符串中有一个文本反斜杠字符,然后是一个文本双引号字符

    (换句话说,作为字符串文字,它看起来像“foo\”)

    如果我只替换引号字符,我将得到一个值为的引号字符串

    foo\\"     
    
    但是这里的两个反斜杠将被解释为一个反斜杠。因此,当我用引号括起这个值时,我会得到不平衡的引号

    "foo\\""
    
    另一方面,如果我先执行步骤1——将所有反斜杠替换为双反斜杠,则

    foo\\"
    
    然后第2步--用斜杠引号替换引号

    foo\\\"
    
    现在,当我用引号字符包装我的值时,我终于得到了

    "foo\\\""
    

    这是正确的。

    您可能希望避免转义已经转义的引号-

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

    FF中有一个非标准的str.quote()

    他们建议采用以下聚填料

        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);
    }
    
    if(!String.prototype.quote){
    //oop版本-无依赖项
    String.prototype.quote=(函数(){
    //准备撤退
    // ----------------
    //反斜杠转义双引号和反斜杠
    var escp_regex=/[\\“]/g,
    escp\U回调=“\\$&”,
    //转义控制字符
    ctrl\u映射={
    “\b”:“\\b”,//退格
    '\t':'\\t',//选项卡
    “\n”:“\\n”,//新行
    “\f”:“\\f”,//表单提要
    '\r':'\\r'//回车
    },
    //不要依赖于'Object.keys(ctrl\u map).join('')`
    ctrl\u regex=new RegExp('[\b\t\n\f\r]','g'),
    ctrl\u回调=函数(匹配){
    返回ctrl_映射[匹配];
    },
    //十六进制转义、备用控制字符和ASCII可打印文件
    // [0-7,11,14-31,127-255]
    xhex_regex=/[\x00-\x07\x0B\x0E-\x1F\x7F-\xFF]/g,
    xhex\u callback=函数(匹配,字符代码){
    char_code=match.charCodeAt(0);
    返回'\\x'+(字符码<16?'0':'')+字符码;
    },
    //你能逃过所有其他人吗
    uhex_regex=/[\u0100-\uFFFF]/g,
    uhex_回调=函数(匹配,字符代码){
    char_code=match.charCodeAt(0);
    返回'\\u'+(字符码<4096?'0':'')+字符码;
    },
    //委托给本机`JSON.stringify`如果可用
    stringify=typeof JSON!='undefined'&&JSON.stringify;
    //返回实际多边形填充
    // ----------------------
    返回函数(){
    var self=this;//促进压缩
    如果(self==null)抛出新的TypeError('无法将'+self+'转换为object');
    如果(stringify)返回stringify(self);
    返回''+自我
    .替换(escp_正则表达式、escp_回调)
    .replace(ctrl\u正则表达式、ctrl\u回调)
    .replace(xhex_regex,xhex_回调)
    .replace(uhex_regex,uhex_callback)+'”;
    }
    }());
    //通用版本-需要函数绑定
    String.quote=Function.call.bind(“”.quote);
    }
    
    为什么这不起作用
    var s1=“a\“b”;var s2=“\”“+s1+”\”;
    ?当你说“你已经有了一个变量”时,你是什么意思?你在哪里有这个变量,你需要用它做什么?这个问题对我来说没有意义。谢谢你-是的,我最后的措辞很混乱。我更新了这个问题。