2009-11-22 122 views
1

試圖從路徑提取的變量名提取變量(變量之前包含:任選地被封閉的()),變量的數量可以變化的Javascript正則表達式:從路徑

「富/酒吧/:firstVar /: (secondVar)foo2的/:thirdVar」

預期輸出應爲:

[ 'firstVar', 'secondVar', 'thirdVar']

試圖像

"foo/bar/:firstVar/:(secondVar)foo2/:thirdVar".match(/\:([^/:]\w+)/g)

但它不工作(不知何故它捕獲冒號&沒有可選附件),如果有一些正則表達式法師,請幫助。提前感謝!

+0

你到底想要捕捉什麼?你能告訴我們你期望的結果嗎? – 2009-11-22 23:19:56

+0

這些是字符串,所以不太明白你的意思是換行 – pentarim 2009-11-22 23:21:43

+0

我很困惑這個問題。你爲什麼想做這個?爲什麼網址看起來如此嚴重?你爲什麼不從一個查詢段中提取變量? – Breton 2009-11-22 23:45:47

回答

3
var path = "foo/bar/:firstVar/:(secondVar)foo2/:thirdVar"; 

var matches = []; 
path.replace(/:\(?(\w+)\)?/g, function(a, b){ 
    matches.push(b) 
}); 

matches; // ["firstVar", "secondVar", "thirdVar"] 
+0

非常感謝你 – pentarim 2009-11-22 23:27:14

2

這個怎麼樣:

/\:\(?([A-Za-z0-9_\-]+)\)?/ 

比賽:

:firstVar 
:(secondVar) 
:thirdVar 

$1包含:

firstVar 
secondVar 
thirdVar 
0

我可能會建議你看看URI template specification?它完全符合你想要做的,但更優雅。我不知道任何當前用於JavaScript的URI模板解析器,因爲它通常是一個服務器端操作,但是最小的實現將是微不足道的。

,而不是本質上說,:

foo/bar/:firstVar/:(secondVar)foo2/:thirdVar 

您使用:

foo/bar/{firstVar}/{secondVar}foo2/{thirdVar} 

希望,這是很顯而易見的,爲什麼這種格式工程的secondVar的情況要好。另外它還有一個額外的優點,即成爲一個規範,儘管目前仍然是一個草案。

+0

感謝您的信息,但通過格式綁定(其Horde_Routes語法) – pentarim 2009-11-22 23:41:32

+1

啊,是的。另一個項目感染了Rails式的路由。哦,值得一試。 – 2009-11-23 04:21:23