李学敏 2018年10月15日 23:25 浏览(239) 回答(7)
已解决
软件开发基础
  • 我有一组数组对象,和一段字符串的节点,然后我要把字符串里面的值用replace查找并替换成数组对象里面对应的数据,然后发现数组对象里面的值有$1的时候,无法替换成功。该如何解决?代码如下:

  • <!DOCTYPE html>

    <html>

    <head>

    <meta charset="UTF-8">

    <title></title>

    <script src="js/jquery-1.8.3.js" type="text/javascript" charset="utf-8"></script>

    <style type="text/css">

    table{

    float: left;

    margin-left: 100px;

    }

    th,td{

    padding: 5px;

    }

    th{

    background-color: gainsboro;

    }

    </style>

    </head>

    <body>

    <table class="table1" border="1" cellpadding="0" cellspacing="0">

    <thead>

    <tr>

    <th>Header1</th>

    <th>Header2</th>

    <th>Header3</th>

    <th>Header4</th>

    </tr>

    </thead>

    <tbody></tbody>

    </table>

    <script>

    $(document).ready(function(){

    var arr = [ //这是一组数组对象数据,注意td2和td3里面的值都有$1这么个字符串

    {td1:'content1',td2:'dsgw $1:00',td3:'asgasg$1:00',td4:'dshse'},

    {td1:'content1',td2:'dsgw $1:00',td3:'asgasg$1:00',td4:'dshse'},

    {td1:'content1',td2:'dsgw $1:00',td3:'asgasg$1:00',td4:'dshse'},

    {td1:'content1',td2:'dsgw $1:00',td3:'asgasg$1:00',td4:'dshse'}

    ],

    trList = '<tr><td>&{td1}</td><td>&{td2}</td><td>&{td3}</td><td>&{td4}</td></tr>';//这是一段tr字符串,我需要把“&{xxx}”占位符替换成上面数据里对应key的value

    String.prototype.format = function(args) {//这是一个拓展的字符串方法,用来替换字符串节点中的值

    if (arguments.length>0) {

    var result = this;

    if (arguments.length == 1 && typeof (args) == "object") { 

    for(var key in args){ //这里循环的key就是数组对象里面的key

    var reg=new RegExp ("(&{"+key+"})","g");//这里用正则表达式去查找字符串中是否存在“&{对象的key}”这样的一个占位符

    result = result.replace(reg, args[key]); //这里的result就是那个字符串节点,然后reg是正则,args[key]就是对应的需要替换之后的值

    }else{//这下面的不需要管,和上面一样

    for(var i = 0; i < arguments.length; i++){ 

    if(arguments[i]==undefined){

    return ""; 

    }else{

    for(var key in arguments[i]){ 

    var reg=new RegExp ("(&{"+key+"})","g"); 

    result = result.replace(reg, arguments[i][key]);

    }

    }

    return result;  //这里把替换之后的字符串节点返回回去

    }else{ 

    return this; 

    };

    var html = '';

    $.each(arr,function(i,j){

    html += trList.format(j);//用上面的字符串节点来点出拓展的字符串方法,j是数组中的每个对象

    });

    $('.table1 tbody').append(html);//把替换了之后的字符串节点插入到页面中

    });

    </script>

    </body>

    </html>

解答7


  • 已采纳

    智学无忧-老曹

    引起这个问题主要原因是正则表达式的(),在正则表达式中()匹配的内容是会保存起来的,而保存起来的内容通过通过$1,$1……这样的方式获取对应()保存的内容。

    恰巧我们要替换的内容里面有一个$1,这样就产生了歧义,$1的内容是第一个()匹配的内容,显然替换的结果就不是我们想要的了。

    知道原理就好办了,解决方法如下:

    1.将正则表达式的()不要 变成  var reg=new RegExp("&{" + key + "}", "g")  或是  var reg=/(&{td2})/g   (推荐使用)

    2.replace()也考虑到$有特殊含义,可以通过$$转义普通字符,所以要替换的内容含有的$都变成$$都可以
       dsgw $1:00   变成    dsgw $$1:00

    2018年10月16日 11:33
  • 李学敏

    因为我们知道正则表达式中是有$1-$n这么一个东西,所以当我们使用正则去查找字符串然后时候replace替换的时候,替换的内容里面如果有$1的话就会和正则产生冲突,而我的解决方法是:我们正则表达式中是有exec()这么一个方法的,而这个方法则是返回正则需要匹配的值,此时我们在使replace(RegExp.$1,data),那么data里面即使是有$1这么一个值,replace()也能正常替换了

    2018年10月16日 12:39
  • 杨强

    var reg=new RegExp ("(&{"+key+"})","g"); 改为 var reg = new RegExp("\\&{" + key + "}", "g");  完美解决   使用构造函数时需使用双反斜杠转义

    2018年10月16日 12:37
  • 唐威

    直接写$1的话代表替换文本$n就是与 regexp 中的第 n个子表达式相匹配的文本,使用$$代替$可实现要求。

    $$:直接量符号微信图片_20181016100211.png

    2018年10月16日 10:03
  • 李南嘉

    在数组对象里面的美元符后面加个空格 因为JQ数组里面不能有美元符  即可打印出来

    td2: 'dsgw $1:00',源码是

    td2: 'dsgw $   1:00',空格后

    2018年10月16日 09:18
  • 廖佳星

    在jq字符串里面使用$符号,应该要处理一下,我这样的话就可以打印出来了

    td2: 'dsgw $$1:00',

    td3: 'asgasg$$1:00',

    2018年10月16日 09:16
  • 李学敏

    可能说的还不是很清楚,意思就是我需要把tr字符串中的&{td2}和&{td3}给替换成数组对象里面对应的td2中的‘dsgw $1:00’和td3的‘asgasg$1:00’,然后你会发现替换之后的值是dsgw &{td2}:00’和asgasg&{td3}:00’,问题很简单,大家可以试试,考验你们的基础的时候到了

    2018年10月15日 23:32