当前位置: 首页 > 图文教程 > 网络编程 > 正则表达式 > js replace正则相关的诡异问题

正则表达式
正则在FireFox和IE下使用test的不同
正确使用带有"g"标记的javascript正则表达式
正则表达式 学习资料整理
javascript 正则表达式用法 小结
正则匹配的test函数
JavaScript 正则表达式 验证整数、小数、实数、有效位小数最简单
检测八位数字是否为有效日期的正则
editplus EmEditor和searchandreplace正则表达式
正则应用之 日期正则表达式
正则表达式 学习参考 推荐入门者看
正则基础之 \b 单词边界
正则基础之 小数点
正则 捕获组(capture group)
Dreamweaver 正则替换(返回调用值)
JavaScript 表单验证正则表达式大全[推荐]
JavaScript 使用正则表达式进行表单验证的示例代码
获取网址路径的正则
去除段首段尾的 和全角的空格的正则
正则表达式匹配任意字符(包括换行符)的写法
EditPlus 正则表达式替换字符串详解

正则表达式 中的 js replace正则相关的诡异问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-12   浏览: 92 ::
收藏到网摘: n/a

最近做会员个人身份页的时候遇上如下问题
测试的昵称: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 即使不用正则,“$&” 也表示向后全匹配!!!
无语!

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

一、

字符

含义

$$

$

$&

指定与整个模式匹配的 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 结果相同:
复制代码 代码如下:

姓名:张剑光{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;
}
}