2009-02-05 53 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)方法的變種,幷包括驗證您的更換,使得「功能」。