软件的一处功能用到EasyUI的表单提交,返回一串字符串,这串字符串里有一段HTML代码,正常的情况下这段HTML代码里的双引号“ 是用 \ 转义过的。在IE中没问题,但是在Firefox和Chrome里那段字符串就自动加上了"而且原来的双引号还在。但是看响应内容的字符串就没有。用firebug调试的时候输出来的字符串就变了。
请求响应和IE中是这样
{"id":2,"title":"文章标题","info":"<span class=\"ke-insertfile\">详见附件。</span>"}
Firefox和Chrome中是这样
{"id":2,"title":"文章标题","info":"<span class="\"ke-insertfile\"">详见附件。</span>"}
没有经过任何处理,一串字符串自动就变成这样了。真不知道Firefox和Chrome怎么处理的。
这串字符串需要变成json对象,所以只能把多出来的东西替换掉。
js中replace方法只能替换第一个匹配的字符串不能做到全局。所以就上网查了下资料,得到的方法有几种:
1. str.replace(/oldString/g,newString)
2. str.replace(new RegExp(oldString,"gm"),newString)
3. 增加String 对象原型方法 replaceAll
String.prototype.replaceAll =
function
(s1,s2){
return
this
.replace(
new
RegExp(s1,
"gm"
),s2);
}
我首先用的是直接增加String对象的原型方法,加上了以后任何一个地方都可以用。
但是试了将近一下午,由于我对正则表达式不怎么会用。最后怎么都匹配不了。
需要替换的有两个
把"\"变成\" 把\""变成\"
第二个好弄,replaceAll('\\"','\\"')这样直接就替换了。
第一个用replaceAll('\\\""','\\"')怎么也替换不了。
试了好多种,前面能匹配那个 ",然后 \ 就匹配不上。
直接用replaceAll('\\','')这样还报错,不能以 \ 结尾。
不管怎么匹配,"\" 中匹配 " 可以,匹配后面的"也可以,就是匹配不到 \
无奈今天早上突然想起来,换个方法,上面第2种方法其实和第三种一样。就换了第一种方法。
开始忽略了引号 replace(/"\\"/g,'\\"')与replace('/"\\"/g','\\"')是两个完全不一样的东西。
实践证明前面的是对的。前面的是表达式,后面的是字符串。然后我就豁然开朗。难道是这个原因?
于是就回去试replaceAll(),结果第一个参数必须是字符串,不支持表达式。只能还是用replace()的方法了。