我有以下内容:
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'一起使用以便全部更换?感谢
答案 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"),...