2012-01-12 24 views
0

我有以下几点:将变量传递给.replace,如何使var与replace一起工作?

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'一起工作,这样一切都被替换了?感谢

回答

1

熔合RegExp构造与标志作为第二个参数:

var r = ':-\\)'; 

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

非常感谢你 – AnApprentice 2012-01-12 04:47:39

+0

@AnApprentice不客气。 :) – 2012-01-12 04:50:35

+1

你也可以使用正则表达式,这可以说是更干净的,比如:'var r = /: - \)/ g;' – 2012-01-12 04:55:58

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() - 它没有正斜杠一个正则表达式的文本,这意味着你刚刚过去的r变量。

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

如果您r变量将始终具有硬编码值你也可以说:

var r = /:-\)/g; // note: have to escape the) 

,只是通过r.replace()