PHP preg_match_all命名组问题

时间:2014-02-06 22:30:30

标签: php regex preg-match-all regex-group

我正在尝试从以下URI获取分组匹配:

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与该路由匹配?

1 个答案:

答案 0 :(得分:5)

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

http://regex101.com/r/gL1aS2

只是解释原始正则表达式的几个问题:

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