将变量传递给.replace,如何使var替换?

时间:2012-01-12 04:42:56

标签: javascript regex

我有以下内容:

var r = ':-)'

html = html.replace(/r/g,"<img src=\""+icon_folder+"/face-"+emoticon+".png\" class=\"emoticonimg\" />");

我想添加/g,以便替换所有匹配项。这不起作用,但是如果我删除g并且只是这样做:

html = html.replace(r,"<img src=\""+icon_folder+"/face-"+emoticon+".png\" class=\"emoticonimg\" />");

这确实有效吗?如何让它与'g'一起使用以便全部更换?感谢

2 个答案:

答案 0 :(得分:2)

正则表达式语法

/expr/flags

文字语法。也就是说,除了可以在字符串文字中包含变量之外,您不能在其中包含变量。因此,您的表达式/r/g未使用您的r变量,它正在寻找字母“r”。

构造正则表达式的另一种方法是使用RegExp()构造函数:

new RegExp(exprString, flags)

参数是字符串,因此您可以传递变量或字符串文字。

var r = ':-\\)';         // note: need to escape the )

html = html.replace(new RegExp(r, "g"),"<img src=\""+icon_folder+
                        "/face-"+emoticon+".png\" class=\"emoticonimg\" />");

你的第二个代码块工作的原因是因为你没有将正则表达式传递给.replace() - 它没有正则表达式字面值的正斜杠,这意味着你只是通过了你的{{1变量。

请注意,使用r通常比正则表达式文字更加繁琐,因为反斜杠在正则表达式中具有特殊含义,但在字符串中也有特殊含义。因此,例如,new RegExp最终会为/\d/ - 即反斜杠需要加倍。 (我相信你可以想象使用长正则表达式会有多么混乱。)在你的情况下,你的正则表达式包含一个右括号,它也需要被转义,所以你的字符串最终为new RegExp("\\d")

如果您的':-\\)'变量始终具有硬编码值,您也可以说:

r

并将var r = /:-\)/g; // note: have to escape the ) 传递给r

答案 1 :(得分:1)

使用带有flags作为第二个参数的RegExp构造函数:

var r = ':-\\)';

html = html.replace(new RegExp(r, "g"),...