`
jianguang_qq
  • 浏览: 92720 次
  • 性别: Icon_minigender_1
  • 来自: 深圳南山
社区版块
存档分类
最新评论

发现一个js replace正则相关的诡异问题

阅读更多

最近做会员个人身份页的时候遇上如下问题:

测试的昵称:jesse$<

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

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

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

然后去掉了正则,将代码改成: 居然还是同样的结果,太诡异了!!!

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

测试代码: IE ff 显示相同: 经测试,“$&” 果真表示正则向后引用的全匹配,算我孤陋,之前居然不知道!

测试代码: ff 显示: IE 显示: 经测试,ff 下居然replace 即使不用正则,“$&” 也表示向后全匹配!!!

无语!

 

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

一、

字符

含义

$$

$

$&

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

$`

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

$'

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

测试代码: Ie ff chrome 结果相同:

二、 ff chromereplace 不使用正则,也对上述特殊字符起作用

ie replace 不使用正则,对上述特殊字符不起作用 测试代码: ff chrome 结果: Ie 结果:

三、 由此,我们在应用replace 等正则相关函数时,是否有必要特殊处理下上述存在情况呢?
测试代码: 页面显示: 你还可以自己测试下:

 

 

比较好的做法是:

function tplReplace(str,json){
    return str.replace(/{(\w+)}/gi,function(a,b){
        return b in json ? json[b] : a;
    }
}
 


7
1
分享到:
评论
2 楼 ccc17638 2012-05-23  
     
1 楼 libmw 2010-11-08  
哎,剑光学长牛啊,刚刚在js讨论区看帖子,看着看着有个链接说正则有个问题,点开看竟然看到了个张建光……
[from:重邮人]

相关推荐

Global site tag (gtag.js) - Google Analytics