如何在Perl的Catalyst中匹配/ foo而不是/ foo /?

时间:2009-04-25 22:27:10

标签: regex perl catalyst

我想匹配/ foo,但不是/ foo /(其中foo可以是任何字符串)或/

我在这些方面尝试了很多东西:

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

但我无法实现我的需要。

我不相信问题出在我的正则表达式上,但因为我想处理一个没有参数的路径:

例如,对于/ aab / c,我来自Catalyst:

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

7 个答案:

答案 0 :(得分:2)

根据the docs

  

正则表达式匹配全局操作,即不引用从中调用它的命名空间...

如果您希望正则表达式仅匹配当前命名空间的根目录,请尝试使用LocalRegex操作:

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

答案 1 :(得分:2)

只有在没有其他更具体的操作可以处理请求时,才能匹配正则表达式或LocalRegex。

您需要支持sub lowermatch :Regex ('/([a-z]+)/([a-z]+)') { }来捕获/ foo / bar并适当地处理它。你现有的存根不应该是'/'。那应该是Root-> default

或者,如果没有参数,你可以在现有的子中转发$ c->,即:

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

希望有所帮助。

答案 2 :(得分:2)

否:指定的Args将表示“任意数量的参数,0或更大”。这意味着在您的初始示例中,/foo/bar/foo/bar/baz是匹配项。正则表达式本身不匹配的正则表达式之后的路径元素将作为操作的参数被吃掉。

(那些告诉你关于你的正则表达式并说'我不知道催化剂但是'的人在这里忽略了一个正则表达式匹配器中的$可以在'/'之前匹配,而不是总是在最后在Catalyst中的URL。其余的用作参数。)

您需要:Args(0)来实现您要实现的目标,指定将0个路径部分用作参数(因此/foo/bar 匹配)

然而,使用

进行快速测试
sub match :LocalRegex('^[a-z]+$') :Args(0)

表明/foo/foo/都匹配,(但这更近了一步:/match/xyz没有)。 Catalyst专门在路径中处理'/',所以我不确定你是否可以做得更好。

答案 3 :(得分:1)

免责声明:我不熟悉Catalyst;这些是(Perl)正则表达式。

如果“foo”必须是字母数字,那么这将是您想要的:

^\/\w*$

如果“foo”真的可以是任何东西,请改用:

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

答案 4 :(得分:1)

对于你所描述的内容,LocalRegex操作可能没问题,但是如果你正在做这种事情,你就是在反对HTTP规范。

答案 5 :(得分:0)

我不知道Catalyst,但基于阅读文档,它看起来像你想要的

子匹配:正则表达式('^ [a-zA-Z] * $'){}

正则表达式如下所示:

  • ^匹配在根之后(即/)
  • [a-zA-Z] *匹配零个或多个a-z或A-Z字符
  • $匹配网址的结尾

答案 6 :(得分:0)

这个答案可能不是你想要的,但我只是想把它放在这里为了完整起见:我可能会使用像ModRewrite这样的东西从/ foo /重定向到/ foo变种。