如何在javascript中替换“with”

时间:2011-08-12 18:01:57

标签: javascript replace

我有一个文本框,它将信息发布到服务器,它是JSON格式的。假设我想为值输入两个引号,JSON结构看起来像:

{
    "test": """"
}

我需要它看起来像:

{
    "test": "\"\""
}

因此它将遵循JSON标准,并且可以解析/可字符化。

我尝试使用

 var val = myVal.replace('"', "\\\"");

但这不起作用。 val最终只有一个转义引用,因此\""非常感谢任何帮助!

4 个答案:

答案 0 :(得分:8)

我的回答做了一些假设,因为我必须在你的问题中填补相当大的空白:

  • 用户将文本字符串输入文本框;
  • 您的脚本将读取文本框内容,并将这些内容用作其正在构建的JSON字符串中某个项的;
  • 脚本以某种方式将此生成的JSON字符串发送到服务器。

如果我做对了,那就继续......


基线代码

所以,对于一些占位符,你正在做:

function get_contents_of_textbox() {
   // Dummy data for example
   return 'My mum pushed and I said "Hello World"!';
}

function send_to_server(json_str) {
   // Dummy action: display JSON string
   console.log(json_str);
}

var myVal = get_contents_of_textbox();
var JSON  = '{ "test": "' + myVal + '" }';
send_to_server(JSON);

Live demo,显示格式错误的JSON。


初始尝试

要确保JSON有效,转义它可能包含的任何引号和反斜杠。你已经试了一下:

myVal = myVal.replace('"', "\\\"");

the result of your attempt是:

{ "test": "My mum pushed and I said \"Hello World"!" }

只有第一个报价已被转义。这是因为默认情况下只替换搜索字符串的一个实例。

Mozilla文档says

  

要执行全局搜索和替换,请在其中包含g标志   正则表达式或如果第一个参数是字符串,则包含   g在flags参数中。


工作尝试

不幸的是,flags参数是非标准的,所以让我们切换到replace的正则表达式版本,并使用其中的/g开关:

myVal = myVal.replace(/"/g, '\\"');

(为了简洁起见,你会注意到我也压缩了替换字符串。)

结果:

{ "test": "My mum pushed and I said \"Hello World\"!" }

Live demo.华友世纪!


完整的解决方案

让我们也添加逻辑来逃避反斜杠,我们最终得到了这个:

function get_contents_of_textbox() {
   // Dummy data for example
   return 'My mum pushed [a back\\slash] and I said "Hello World"!';
}

function send_to_server(json_str) {
   // Dummy action: display JSON string
   console.log(json_str);
}

var myVal = get_contents_of_textbox();
myVal = myVal.replace(/\\/g, '\\\\'); // escape backslashes
myVal = myVal.replace(/"/g, '\\"');   // escape quotes

var JSON  = '{ "test": "' + myVal + '" }';
send_to_server(JSON);

结果:

{ "test": "My mum pushed [a back\\slash] and I said \"Hello World\"!" }

Live demo.

答案 1 :(得分:4)

使用此

var val = myVal.replace(/"/g, '\\"');

答案 2 :(得分:0)

只需创建一个JS数组

var arr = {
   test: '""'
}

让JSON接口为您处理转义。你不应该自己处理细节。

答案 3 :(得分:0)

正如您所说,您从文本框中获取字符串时,您无需对其执行任何操作即可将其恢复到服务器。如果您通过jQuery的$()表示法或纯document.getElementById获得文本框的值,则它已经被正确转义。 JavaScript不会获取文本框的值,并尝试将其放在引号中。

如果您的文字框中输入了"",则document.getElementById('mytextbox').value不等于"\"\""。只有在定义字符串文字时才需要使用反斜杠。

尝试删除所有转义和正则表达式替换,只需从文本框中发回数据而不对其执行任何操作。你的json应该看起来像:

{
    "test" : document.getElementById('myTextBox')
}