测试的昵称:jesse$<
查看代码:Javascript代码
看代码很快可以注意到两点:“replace 正则”和“$ ”。
在js 中replace 支持正则表达式,而$ 又恰好是正则向后匹配的特殊字符,很容易想到是正则引起的问题。而据我所知正则向后引用只有$1 、$2 、$3 、$4…… ,而这里只有一个”$” 没有数字。
昵称“jesse$< ”在后台经html 特殊字符处理,传到前端是:“jesse$< ”,看页面结果注意到“$” 后的“&” 的也被替换了。难道是“$&” 在js 里表示正则向后引用的全匹配?
然后去掉了正则,将代码改成:Javascript代码
居然还是同样的结果,太诡异了!!!
更诡异的是在IE 下查看,居然是显示正确的(之前一直在ff 下测试)!
测试代码:Javascript代码
IE 和ff 显示相同:C-sharp代码
姓名:张剑光{NAME}amp;
经测试,“$&” 果真表示正则向后引用的全匹配,算我孤陋,之前居然不知道!
测试代码:Javascript代码
ff 显示:C-sharp代码
姓名:张剑光{NAME}amp
IE 显示:C-sharp代码
姓名:张剑光$&
经测试,ff 下居然replace 即使不用正则,“$&” 也表示向后全匹配!!!
无语!
查找资料、测试并总结如下:
一、
字符 |
含义 |
$$ |
$ |
$& |
指定与整个模式匹配的 stringObj 的部分。 |
$` |
指定由 $& 描述的匹配之前的 stringObj 部分。 |
$’ |
指定由 $& 描述的匹配之后的 stringObj 部分。 |
测试代码:
document.write(“姓名:{NAME}__”.replace(/{NAME}/g,”张剑光$&”));
document.write(“姓名:{NAME}__”.replace(/{NAME}/g,”张剑光$$”));
document.write(“姓名:{NAME}__”.replace(/{NAME}/g,”张剑光$`”));
document.write(“姓名:{NAME}__”.replace(/{NAME}/g,”张剑光$'”));
Ie 、ff 和chrome 结果相同:
二、 ff 和chrome 下replace 不使用正则,也对上述特殊字符起作用
ie 下replace 不使用正则,对上述特殊字符不起作用 测试代码:
document.write(“姓名:{NAME}__”.replace(“{NAME}”,”张剑光$&”));
document.write(“姓名:{NAME}__”.replace(“{NAME}”,”张剑光$$”));
document.write(“姓名:{NAME}__”.replace(“{NAME}”,”张剑光$`”));
document.write(“姓名:{NAME}__”.replace(“{NAME}”,”张剑光$'”));
ff 和chrome 结果:
Ie 结果:
三、 由此,我们在应用replace 等正则相关函数时,是否有必要特殊处理下上述存在情况呢?
测试代码:
var str2 = “$<jesse$<“;
document.write(str.replace(/{NAME}/g,str2));
document.write(“<br />”);
document.write(str.replace(/{NAME}/g,str2.replace(/$/g,’$$$$’)));//注意这里是四个“$”
页面显示:
姓名:$<jesse$<
你还可以自己测试下:
var str2 = “$<jesse$<“;
document.write(str.replace(/{NAME}/g,str2.replace(/$/g,’$$’)));
比较好的做法是:
return str.replace(/{(w+)}/gi,function(a,b){
return b in json ? json[b] : a;
}
}
以上就是【js replace正则相关的诡异问题】的全部内容了,欢迎留言评论进行交流!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容