当replace遇到$美元符号引发的问题和解决方案
2023-11-04 本文已影响0人
码农私房菜
在需求开发过程中,需要使用Fiddler来mock响应数据替换,由于响应数据中含有$转义关键字,导致数据匹配结果不是我们预期的正常结果,下面我们看下示例代码:
// 匹配响应html文件,且域名为www.baidu.com的文件
if (oSession.oResponse.headers.ExistsAndContains("Content-Type","text/html") && oSession.uriContains("www.baidu.com")) {
//decode响应体
oSession.utilDecodeResponse();
//下面是使用正则表达式替换(获取Body后改写Body内容在通过代码设置到响应中)
var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
// 读取本地文件路径
var textPath = "D:/myNew3.txt"
// 读取文件每一行到allnum集合中
var allnum = File.ReadAllLines(textPath);
// 定义一个初始数据
var strData = '';
for(var i = 0;i< allnum.Length;i++){
var lineTrim = allnum[i].Trim()
if (lineTrim.IndexOf("//")> -1) {
if(lineTrim.StartsWith("//") ){
continue;
} else {
lineTrim = lineTrim.replace(/ \/\/ .*/,"\n");
}
}
strData += lineTrim + '\n'
FiddlerObject.log('+++++++++++++++本地行数据*************'+ allnum[i]);
}
/**
先用fidder把autoResponse设置成本地的一个没有加密混淆过的js文件。 定位到问题是出现在 “str = str.replace(oRegEx, '<script>'+ strData +'</script></body>');”这一行。
*/
strData = strData.replace(/\$/g,"$$$$") // 处理所有$特殊字符,避免不可预期的异常
FiddlerObject.log('++++++++本地数据:+++++++'+ strData);
//使用正则表达式替换目标内容
var oRegEx = /<\/body>/gi;
oBody = oBody.replace(oRegEx, '<script>'+ strData +'</script></body>');
//将处理后的Body设置到响应中
oSession.utilSetResponseBody(oBody);
}
看到上述描述,对于javascript中的replace(exp,replacement)函数的replacement参数,$
(美元符号)是有特殊含义的。 那么我们的replacement如果是服务器返回的内容或者是其他不可预知的字符串(可能包含$
),最后的替换结果就会出问题。
那么如何规避这个问题呢? $$: A literal dollar sign
–这个一行提示给了我们答案。 就是在replacement中$$
是代表$
符号的,也就是类似转义符一样。
那么我们程序可以改成如下:
var str = "abc";
var res = str.replace(/b/g,content.replace(/\$/g,"$$$$"));
alert(res); // aA$_Bc
解释:因为content是”A$_B″
,我们要把其中的$_
美元符号合法化,就要把content中的$
替换成$$
。但是在replacement中$$
才被当作一个$
。所以我们把$
替换成 $$$$
就好。
但是$
在exp中也有特殊意义,我们需要\$
表示,所以替换函数就成了 content.replace(/\$/g,”$$$$”)
.