JavaScript.Replace包含在HTML标记之外的美元符号($)的内容

时间:2012-05-24 14:47:51

标签: javascript regex

注意:我没有尝试使用正则表达式解析HTML

我正在尝试用字符串替换$ signs($例如$)中包含的任何内容。我已经设法提出了str.replace(/\$([^\$]*)\$/g), "hello $1!"),但是我遇到了确保在将这些字符串包装在HTML标记中时不会替换这些字符串的问题。

示例字符串:$someone$, <a>$welcome$</a>, and $another$

表达式:/[^>]\$([^\$]*)\$[^<]/g

预期输出:hello someone!, <a>$welcome</a>, and hello another!

实际输出:$someonhello , !elcomhello , and !nother$

测试代码:alert("$someone$, <a>$welcome$</a>, and $another$".replace(/[^>]\$([^\$]*)\$[^<]/g, "hello $1!"));

小提琴: http://jsfiddle.net/WMWHZ/

谢谢!

1 个答案:

答案 0 :(得分:4)

请记住,您的测试用例中有6个'$'。这里的问题是,当您尝试检查前一个字符是否不是'&gt;'时,正则表达式向前移动并匹配 4th 5th 之间的内容美元符号,捕获"</a>, and "并制造混乱。

试试这个:

$('div').text(test.replace(/(^|[^>])\$([^<][^\$]*)\$(?!<)/g, "$1hello $2!"))​

Javascript不支持正则表达式中的lookbehinds,但它支持前瞻((?!<)部分)。为了模仿lookbehinds,你正确地尝试将[^>]放在美元之前,但是然后匹配了这个字符,所以你必须抓住它并将它再次放在字符串中。

你只需要稍微改进一下,因为如果'$'位于字符串的开头,则不会捕获该组。

另外,为了避免上述问题,您应该检查是否没有'&lt;' 之后的第一个美元,所以我在捕获组的开头放了一个[^<]。这也意味着它不会在美元符号之间捕获空字符串(如'$$'),它们必须包含至少一个字符。

这样,您就有了预期的结果。