【问题标题】:Regex to match route parameters正则表达式匹配路由参数
【发布时间】:2017-04-08 09:33:24
【问题描述】:

我总是在使用正则表达式时遇到一些困难。当路由设置了参数时,我正在尝试制作与路由匹配的正则表达式:

例如:

  • /post/1 匹配 /post/{id}
  • /post/5/ 不匹配 /post/{id}
  • /post/6/comments/4 匹配 /post/{id}/comments/{comment}
  • /post/a-random-slug 匹配 /post/{id}/post/{slug}(无论你想给参数命名)
  • /user 匹配 /user,但不匹配 /user/

我目前所做的是为每个路由创建一个正则表达式,然后将当前 URI 与该路由正则表达式进行匹配。

我目前拥有的是:

My regex

在这个例子中,我尝试为路由创建一个正则表达式:/post/{param1}/{param2}。这意味着它应该匹配/post/,然后是一个参数和另一个参数,但没有那个参数之后。

如您所见:^(\/post\b)(\/.{1,}\/)(.{1,}\b)$ 匹配 /post/what-is-your-name/5,当我添加另一个 / 时,它不再匹配。但是,如果您再次在该正则表达式之后添加字符 ,它将再次开始匹配。

意思是:

  • /post/what-is-your-name/5/ 不匹配
  • /post/what-is-your-name/5/more 确实匹配

有人知道如何完成第一个示例吗?

到目前为止,我是一个非常了解正则表达式的人,如果有人看到更好的方法来匹配 URI 和路由,请告诉我。

【问题讨论】:

    标签: php regex url-routing


    【解决方案1】:

    希望对你有所帮助

    正则表达式:^(?:\/post\b)(?:\/[\w]+){2}$

    Regex demo

    【讨论】:

    • 这是我目前拥有的,注意这条路线应该匹配/post/{param}/{param},仅此而已。如果你之后添加它仍然匹配我的和你的例子regex101.com/r/gh8Wug/2
    • @MelvinKoopmans 你能做一件事,只是用更多你想要匹配或不匹配的例子来更新你的帖子
    • @MelvinKoopmans 在这个regex101.com/r/gh8Wug/2 中你能说一下你不想匹配哪一个
    • 我正在尝试匹配/post/{param}/{param} 仅此而已。现在你的我的正则表达式也匹配它之后的所有内容,这意味着 /post/{param}/{param}/{param}/{param} 也匹配
    • @MelvinKoopmans 请检查此regex101.com/r/gh8Wug/3 希望它能正常工作,如果它不起作用,只需在链接中提及您不想匹配的那个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2015-04-29
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多