2009-04-25 67 views
1

我想匹配/ foo的,但不是/ foo /(其中foo可以是任意字符串)或/如何在Perl的Catalyst中匹配/ foo而不是/ foo /?

我嘗試了很多的東西沿着這些路線:

sub match :Path :Regex('^[a-z]+$') 
sub match :Regex('^[a-z]+$') 
sub match :Path :Args(1) 

但我不能達到什麼我需要。

我不相信這個問題是我的正則表達式,而是因爲我要處理的路徑沒有參數:

[debug] "GET" request for "aab/c" from "192.168.1.100" 
[debug] Path is "aab" 
[debug] Arguments are "c" 

例如,/ AAB/C,從我得到的催化劑

+0

任何機會,你可以提到*爲什麼*你想這樣做?我想不出一個。 – castaway 2009-04-26 08:32:36

+0

是的,我考慮得越多,就越有意識地忽略了這種能力。 – 2009-04-28 13:25:14

回答

2

否:指定的參數意味着「任意數量的參數,0或更大」。這意味着在你最初的例子中,/foo/bar/foo/bar/baz是匹配的。正則表達式之後的正則表達式本身不匹配的路徑元素將作爲參數被吃掉。

(正在告訴你有關您的正則表達式的事情並說'我不知道催化劑但是'的人在這裏忽略了正則表達式匹配器中的$可以在'/'之前匹配的點,而不總是在該URL,在催化劑的結束。其餘部分則用作參數。)

您將需要:Args(0)爲你想達到什麼目的,指定0路部分將被用作參數(所以/foo/bar沒有按't匹配)。

然而,快速測試使用

sub match :LocalRegex('^[a-z]+$') :Args(0) 

表明/foo/foo/都匹配,(但這又近了一步:/match/xyz沒有)。催化劑特別在路徑中對待'/',所以我不確定你是否可以做得比這更好。

0

我不知道催化劑,但基於閱讀它看起來像你想

子匹配文檔:正則表達式( '^ [A-ZA-Z] * $'){}

的正則表達式像這樣崩潰:

  • ^匹配恰好在根之後(即,在/)
  • [A-ZA-Z] *匹配零個或多個a-z或A-Z字
  • $匹配網址的結束
1

免責聲明:我不熟悉的催化劑;這些是(Perl)正則表達式。

如果 「富」 必須是字母數字,這將做你想做的:

^\/\w*$ 

如果 「富」,才能真正是任何東西,而是用這個:

^\/$|^\/.*[^\/]$ 
2

the docs

正則表達式匹配行爲在全球範圍內,即不參考名稱空間,它被稱爲...

如果你想在正則表達式僅在當前命名空間的根匹配,嘗試使用LocalRegex動作來代替:

sub match : LocalRegex('^[a-z]+$') 
2

如果沒有其他更具體的行動正則表達式或LocalRegex將只匹配可以處理請求。

您需要支持sub lowermatch :Regex ('/([a-z]+)/([a-z]+)') { }才能捕獲/ foo/bar並對其進行適當的處​​理。雖然你現有的存根不應該捕捉'/'。這應該經歷到根 - >默認

或者,如果沒有參數,你可以$ C->前鋒在現有子,即:

sub match :Regex ('/foo') { 
    my ($self, $c, @args) = @_; 
    $c->forward('noargs_action') unless @args; 
    ... 
} 

希望有所幫助。

1

LocalRegex的操作對於您所描述的內容可能是正確的,但是如果您正在做這種事情,那麼您正在與HTTP規範作鬥爭。

0

這個答案可能不是你要找的,但我只是想把它放在這裏爲了完整起見:我可能會使用類似ModRewrite的東西來重定向從/ foo /到/ foo變體。

相關問題