美文网首页
当replace遇到$美元符号引发的问题和解决方案

当replace遇到$美元符号引发的问题和解决方案

作者: 码农私房菜 | 来源:发表于2023-11-04 16: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,”$$$$”).

相关文章

  • Mybatis 转义

    ibatis 中需要对 井号和美元符号转义。使用 ## 代替#,使用$$ 代替 $。今天遇到的问题: 在 mysq...

  • 希望加油站

    每个阶段遇到的问题总量不变,生活是解决问题的总和。 如果遇到的问题有解决方案,就有希望;当遇见的问题没有解决方案,...

  • 避免MySQL替换逻辑SQL的坑爹操作

    replace into和insert into on duplicate key 区别replace的用法 当不...

  • Markdown中的行列式和矩阵(LaTex)

    一、语法 1、基本矩阵: 两个美元符号是行间,一个美元符号是行内(数学符号和公式通用)。 其中 \left| 和 ...

  • 文本编辑空格和链接的问题

    在实际的应用中文本编辑器出现一个问题,当加上链接后,整个编辑器报BUG解决方案,主要应用了替换,replace代码...

  • *** Current working directory no

    在使用poco库中,可能遇到这个问题。对于这个问题,官网给的解决方案是当前目录中不能包含符号链接。 查看了路径,好...

  • 11月17日 简言

    当遇到问题感到焦虑时,先设想最坏结局,接受或者寻找解决方案。

  • 组件化开发遇到的问题

    组件化开发遇到的问题 1、Suggestion: add 'tools:replace="android:name...

  • IDEA mac快捷键

    Mac键盘符号和修饰键说明 一、Editing(编辑) 二、Search/Replace(查询/替换) 三、Usa...

  • 正则表达式重温整理

    三大基础符号:Bracket括号符号、caret插入符号和Dollars美元符号 在正则表达式中存在三种括号符号:...

网友评论

      本文标题:当replace遇到$美元符号引发的问题和解决方案

      本文链接:https://www.haomeiwen.com/subject/vapaidtx.html