2014-02-06 69 views
1

我试图让分组从以下URI匹配:PHP preg_match_all问题

route: "/user/{user}/{action}" 
input: "/user/someone/news" 

什么是适当的正则表达式吗?我一直在寻找自己的酸味在过去的几个小时......

我已经试过这样的事情,但没有结果:(

~\/app\/user\/(?P<user>[.*]+)\/(?P<action>[.*]+)~ 

我得到的组重新比赛阵中,但没有结果基于所述组内的输入

所需的输出:

Array 
(
    [0] => Array 
     (
      [0] => "someone" 
     ) 

    [user] => Array 
     (
      [0] => "someone" 
     ) 

    [1] => Array 
     (
      [0] => "news" 
     ) 

    [action] => Array 
     (
      [0] => "news" 
     ) 
) 

为了用一个例子阐明

我的控制器有以下途径:/app/user/{username}/{action} 来自浏览器的请求URI是:/app/user/john/news

如何匹配请求URI反对使用正则表达式图案而醒目的括号中的变量路线?

+0

问题不明确 – zerkms

+0

你究竟想要匹配什么(给出确切的例子)以及期望的结果是什么。 (举例)。 – MElliott

+0

对不起。我试图使用正则表达式匹配上面提到的输入到路线,并捕获括号内的棋子。 route:/ user/{username} 输入:/ user/john-smith 正则表达式:? – Harold

回答

5
/user/(?P<user>[^/]+)/(?P<action>[^/]+) 

http://regex101.com/r/gL1aS2

只是解释了几个问题,你原来的正则表达式:

  • [.*]+意味着一个点的出现的正数和一个星号而已,例如:*.*.*.......; [^/]+描述了任意字符的正数,但斜杠。
  • 无需转义斜杠,因为当您使用~作为分隔符时,它们不是特殊字符。
  • 你的正则表达式在开始时也需要/app,它不在你的字符串中。
+3

就是这样;然而,我会使用'[^ ​​/] +'而不是'。+'(即使两者都有效)。另外,应该注意的是,由于OP使用'〜'作为分隔符,所以正斜线不会被转义。 – Sam

+1

耶,它的作品!非常感谢:)结果比我尝试做的事情要轻很多:p – Harold

+0

@SamSullivan好点。我已经更新了答案。哈罗德,我很高兴能够帮到你。 – Bugs