当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,”$$$$”).

上一篇 下一篇

猜你喜欢

热点阅读