
-
我有一组数组对象,和一段字符串的节点,然后我要把字符串里面的值用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:002018年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个子表达式相匹配的文本,使用$$代替$可实现要求。
$$:直接量符号
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