2009-02-05 65 views
3

我尝试在JavaScript中编写简单的Markdown解析器。因此我想检查[link content][link id]语法。我使用下面的代码:JavaScript RegExp对象

data = data.replace(/\[(.*?)\][ ]*\[([0-9]+)\]/g, '<a href="$2">$1</a>'); 

它运作良好,但现在我想用RegExp对象来做到这一点。所以我设置了下面的代码位:

var r = new RegExp('\[(.*?)\][ ]*\[([0-9]+)\]', 'g'); 
data = data.replace(r, '<a href="$2">$1</a>'); 

但它不工作。它甚至说,我的正则表达式(其中工程以来,第一个例子做了很好的工作)是无效的:

无与伦比)在正则表达式

我认为,必须有一些RegExp-做我不知道的物体特性。 我在做什么错,怎么解决问题?

+1

在旁注中,您可能会发现通过在线测试程序运行JavaScript正则表达式很有用(http://www.pagecolumn.com/tool/regtest.htm)。 – Dscoduc 2009-02-05 17:27:50

+0

谢谢,似乎是一个伟大的工具。我使用了这个(http://regexp-evaluator.de/evaluator/)PHP-ish评估器。也许JS-ish在使用JS编写脚本时效果更好:) – okoman 2009-02-05 17:31:31

回答

13

因为RegExp构造函数的第一个参数是一个字符串,而不是一个模式的文字,你必须逃离反斜杠,因为要在图案文字反斜线:

var r = new RegExp('\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g'); 
0
var r = /\[(.*?)\][ ]*\[([0-9]+)\]/g; 
data = data.replace(r, '<a href="$2">$1</a>'); 
0

双逃逸你反斜线:

var r = new RegExp('\\[(.*?)\\][ ]*\[([0-9]+)\\]', 'g'); 
0

你需要双逃生:

var r = new RegExp('\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g') 
1

除了模式的反斜杠的问题,这样的:

data = data.replace(r, '<a href="$2">$1</a>'); 

可能是危险的。我假设你已经照顾了HTML转义,所以我就不能做到这一点:

[<script>stealCookies()</script>][http://oops.example.com/] 
[hover me][http://hello" onmouseover="stealCookies()] 

,但你仍然需要查询的网址是一个已知的良好方案所以我不能做到这一点:

[click me][javascript:stealCookies()] 

您可能需要使用与string.replace(R,FUNC)方法的变种,并包括验证您的更换,使得“功能”。