2013-05-16 30 views
4

更新:我的問題沒有準確傳達我想要達到的目標。我希望匹配/foo,/foo/,以及/foo/(例如/foo/asdf/jkl)以下的任何內容,而不是特定路徑。原來的問題如下。快遞:頂級路徑的可選尾部斜槓


我想匹配以下路徑:下面

/foo/   -> /foo 
/foo/bar/  -> /foo/bar 
/foo/bar/baz/ -> /foo/bar/baz 

我想:

app.get('/foo/*', ...); 

/foo 
/foo/bar 
/foo/bar/baz 

這些應該工作,太在/foo的情況下失敗H。我知道我可以提供一個正則表達式而不是一個字符串,但這肯定是一個常見的要求,所以我很驚訝地發現模式匹配的DSL不適應它。

回答

5

看來,正則表達式是要走的路:我有這個問題,也是

app.get(/^[/]foo(?=$|[/])/, ...); 
0

離開斷斜線和它應該工作得很好:如果你想在一個模式相匹配他們

app.get('/foo', ...); 
+0

這會導致誤報。例如,'/ foobar'會匹配。 – davidchambers

+0

@davidchambers不,它不會。默認情況下,Express會匹配Andrew建議的路由和'/ foo'和'/ foo /'(但沒有其他)。您可以使用[strict routing](http://expressjs.com/api.html#app-settings)選項關閉該行爲,但在您的情況下,Express的默認行爲應該可以正常工作。 – robertklep

+0

@robertklep你說得對。我誤解了Andrew的建議,因爲'/ foo *'(它有錯誤的/ foobar匹配問題)。 '/ foo'的問題是/ foo/bar不匹配。我總結了['/ foo'和'/foo*'](http://bit.ly/10IhTRL)的問題。 – davidchambers

5

app.get('/foo(/bar(/baz)?)?', ...) 

允許在任意/的默認快遞行爲結束適用。

編輯:這個怎麼樣?

app.get('/foo/:dummy?*', ...) 
+0

我已經更新了這個問題。對不起,我第一次缺乏清晰度。 – davidchambers

+0

嘿。 '/ foo /:dummy?*'應該這樣做,雖然它和正則表達式一樣神祕。 ;) – davidchambers

+0

是的,我認爲它大致轉換爲'/ foo(/.+?)?(.*)'(加上檢查一個尾部的斜線) – robertklep

1

,我不得不承認,正則表達式的作品是最好的,但是有輕微改善:

app.get('/foo([/].*)?', ...); 

這將匹配:

/foo 
/foo/ 
/foo/what/ever/you/put/after 

/foo/:dummy?*在考慮foo之後並沒有真正採用可選的/,並且/foo(/:dummy*)?不能正確匹配。

/foo(/:dummy)?*有點作品,但創建了一個額外的變量,因爲它有單獨的變量path*,在這種情況下這是不適宜的。

因此,我個人堅持正則表達式。

+0

你能解釋一下這是對'/ foo^[/] FOO(= $ |?[/])/'? – davidchambers

+0

@davidchambers'/^[/] foo(?= $ | [/])/'不會佔用網址的其餘部分並將其發送回一個變量。它只匹配'/ foo'和'/ foo /'...除非我誤解了某些東西 – Tokimon

+0

你錯誤地解釋了@Tokimon模式。它匹配以'/ foo'開始的字符串,後面跟着無('$')或斜槓('[/]')。所以''/ foo''和''/ foo /''是匹配的,但'/ foo/bar/baz''也是匹配的。你說得對,該模式並沒有捕捉到其餘的路徑,但這不是必需的。 – davidchambers