js replace正则相关的诡异问题

hope00520

hope00520

2016-02-19 09:51

下面是个简单易学的js replace正则相关的诡异问题教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!
 
测试的昵称:jesse$

查看代码:Javascript代码
代码如下:

$id("f_msg_grow_1").innerHTML=msg["not_club"]["grow_value"].replace(/{NICK_NAME}/,this.info["friend"]["nick_name"]);

看代码很快可以注意到两点:“replace 正则”和“$ ”。

在js 中replace 支持正则表达式,而$ 又恰好是正则向后匹配的特殊字符,很容易想到是正则引起的问题。而据我所知正则向后引用只有$1 、$2 、$3 、$4…… ,而这里只有一个”$” 没有数字。

昵称“jesse$ ”在后台经html 特殊字符处理,传到前端是:“jesse$ ”,看页面结果注意到“$” 后的“&” 的也被替换了。难道是“$&” 在js 里表示正则向后引用的全匹配?

然后去掉了正则,将代码改成:Javascript代码
代码如下:

$id("f_msg_grow_1").innerHTML=msg["not_club"]["grow_value"].replace("{NICK_NAME}",this.info["friend"]["nick_name"]);

居然还是同样的结果,太诡异了!!!

更诡异的是在IE 下查看,居然是显示正确的(之前一直在ff 下测试)!

测试代码:Javascript代码
代码如下:

document.write("姓名:{NAME}".replace(/{NAME}/g,"张剑光$&"));

IE 和ff 显示相同:C-sharp代码
姓名:张剑光{NAME}amp;
经测试,“$&” 果真表示正则向后引用的全匹配,算我孤陋,之前居然不知道!

测试代码:Javascript代码
代码如下:

document.write("姓名:{NAME}".replace("{NAME}","张剑光$&"));

ff 显示:C-sharp代码
姓名:张剑光{NAME}amp
IE 显示:C-sharp代码
姓名:张剑光$&
经测试,ff 下居然replace 即使不用正则,“$&” 也表示向后全匹配!!!
无语!

查找资料、测试并总结如下:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

一、

字符

含义

$$

$

$&

指定与整个模式匹配的 stringObj 的部分。

$`

指定由 $& 描述的匹配之前的 stringObj 部分。

$'

指定由 $& 描述的匹配之后的 stringObj 部分。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

测试代码:

代码如下:

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 结果相同:
代码如下:

姓名:张剑光{NAME}amp__姓名:张剑光$__姓名:张剑光姓名:__姓名:张剑光____

二、 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}","张剑光$`"));
document.write("姓名:{NAME}__".replace("{NAME}","张剑光$'"));

ff 和chrome 结果:
代码如下:

姓名:张剑光{NAME}amp__姓名:张剑光$__姓名:张剑光姓名:__姓名:张剑光____

Ie 结果:
代码如下:

姓名:张剑光$&__姓名:张剑光$&__姓名:张剑光$$__姓名:张剑光$`__姓名:张剑光$'__

三、 由此,我们在应用replace 等正则相关函数时,是否有必要特殊处理下上述存在情况呢?
测试代码:
代码如下:

var str = "姓名:{NAME}";
var str2 = "$jesse$";
document.write(str.replace(/{NAME}/g,str2));
document.write("br /");
document.write(str.replace(/{NAME}/g,str2.replace(/$/g,'$$$$')));//注意这里是四个“$”

页面显示:
代码如下:

姓名:{NAME}lt;jesse{NAME}lt;
姓名:$jesse$

你还可以自己测试下:
代码如下:

var str = "姓名:{NAME}";
var str2 = "$jesse$";
document.write(str.replace(/{NAME}/g,str2.replace(/$/g,'$$')));

比较好的做法是:
代码如下:

function tplReplace(str,json){
return str.replace(/{(w+)}/gi,function(a,b){
return b in json ? json[b] : a;
}
}
展开更多 50%)
分享

猜你喜欢

js replace正则相关的诡异问题

Web开发
js replace正则相关的诡异问题

JS的replace方法与正则表达式结合应用讲解

Web开发
JS的replace方法与正则表达式结合应用讲解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

js验证email的正则

Web开发
js验证email的正则

JS 正则 时间验证

Web开发
JS 正则 时间验证

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

js正则匹配table tr

Web开发
js正则匹配table tr

一个JS正则的题

Web开发
一个JS正则的题

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JSP 多条SQL语句同时执行的方法

JSP 多条SQL语句同时执行的方法

java 汉诺塔Hanoi递归、非递归(仿系统递归)和非递归规律 实现代码

java 汉诺塔Hanoi递归、非递归(仿系统递归)和非递归规律 实现代码
下拉加载更多内容 ↓