为什么传递给replace()函数的替换字符串中的$会在某些时候中断?

时间:2010-03-09 23:08:47

标签: javascript regex

我有一个变量用于构建JavaScript函数调用,JavaScript有.replace()用span和onclick事件包围文本行。 .replace()部分如下所示:

code.replace(/(\d{4}\s+)?(LOCAL|PARAMETER|GLOBAL)\s+USING\s+([\S]+)/g, 
   "<span class=\"natprint_popup\" onclick=\"getNaturalCode('" 
     + lib 
     + "','$3','@#test_prod_qual|',0,'Y'); return false;\">$&</span>");

唯一的问题是变量lib在某些时候最后包含$;例如,lib == DPDRI$。这导致我页面上的JavaScript中断,我得到的输出在lib结束时中断,并将其余的Javascript函数参数显示为纯文本:

,'DPDPDRNO','TEST',0,'Y'); return false;">

我几天来一直在寻找无用的答案。我已经尝试过lib.replace(/\$/g, "\\$");并且\$已成功进入变量,但它仍然会破坏我的代码。似乎JavaScript引擎试图将$末尾的lib解释为捕获的匹配,并且它正在让它爆炸。任何人都有任何想法如何使这项工作?

1 个答案:

答案 0 :(得分:2)

请参阅MDC上Specifying a string as a parameter sectionreplace() documentation

  

替换字符串可以包含以下特殊替换模式:

Pattern    Inserts
$$    Inserts a "$".
...
$'    Inserts the portion of the string that follows the matched substring.
...

请注意,由于您的变量内容作为单引号包装参数插入到您从onclick调用的函数中,因此总是后跟一个' - 所以当它以$结尾,你将无意中创建一个替换模式:

 ... onclick=\"getNaturalCode('DPDRI$' ...

现在,您可以只更改引用该特定参数的方式。但为了安全起见,你应该真正逃脱$符号:

 + lib.replace(/\$/g, "$$$$")

上述修改将在插入替换字符串之前将“DPDRI $”转换为“DPDRI $$”,允许最终替换包含文字$。