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+”\”;
?当你说“你已经有了一个变量”时,你是什么意思?你在哪里有这个变量,你需要用它做什么?这个问题对我来说没有意义。谢谢你-是的,我最后的措辞很混乱。我更新了这个问题。