我尝试用JavaScript编写一个简单的Markdown解析器。因此,我想检查[link content][link id]
语法。我使用以下代码:
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-object特性有关。 我做错了什么以及如何解决问题?
答案 0 :(得分:13)
因为RegExp构造函数的第一个参数是字符串而不是模式文字,所以你必须转义反斜杠,因为你需要模式中的文字反斜杠:
var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' );
答案 1 :(得分:1)
除了模式的反斜杠问题,这个:
data = data.replace( r, '<a href="$2">$1</a>' );
可能很危险。我假设你已经处理了HTML转义,所以我将无法做到这一点:
[<script>stealCookies()</script>][http://oops.example.com/]
[hover me][http://hello" onmouseover="stealCookies()]
但你仍然需要检查URL是一个已知良好的方案,所以我不能这样做:
[click me][javascript:stealCookies()]
您可能希望使用该方法的String.replace(r,func)变体,并在替换制作'func'中包含验证。
答案 2 :(得分:0)
var r = /\[(.*?)\][ ]*\[([0-9]+)\]/g;
data = data.replace( r, '<a href="$2">$1</a>' );
答案 3 :(得分:0)
双重逃避你的反斜杠:
var r = new RegExp( '\\[(.*?)\\][ ]*\[([0-9]+)\\]', 'g' );
答案 4 :(得分:0)
你需要双重逃避:
var r = new RegExp( '\\[(.*?)\\][ ]*\\[([0-9]+)\\]', 'g' )