【问题标题】:regex explode url parts正则表达式分解 url 部分
【发布时间】:2015-02-25 12:51:08
【问题描述】:
// repeat /?([^/)? 10 times
preg_match("`/?([^/]+)/?([^/]+)?/?([^/]+)?/?([^/]+)?/?([^/]+)?/?/?([^/]+)/?([^/]+)?/?([^/]+)?/?([^/]+)?/?([^/]+)?/?`");

这是我用来解析请求 uri 而不进行查询的正则表达式。它最多可以捕获 10 个 url 部分。这不是最佳的也不是好的。目前的解决方法是放足够多的/?([^/]+),并希望没有人会超过这个限制。

是否有可以捕获无限 url 部分的正则表达式?基本上我需要这样做的正则表达式:explode('/', $url)

警告:只能使用 preg_match!

没有爆炸,preg_match_all,g,

【问题讨论】:

  • (/?([^/]+))* 呢?
  • parse_str 呢?
  • 只是好奇,为什么不能用explode?​​span>
  • @Tom Hart:整个 url 路由器使用 preg_match 就是这样。我可以使用“.”进行最后一次检查,而不是在关闭时爆炸 request_uri。我希望有纯正/干净的正则表达式解决方案。
  • @marsze 似乎不起作用regex101.com/r/lZ0jV4/2

标签: php regex parsing url


【解决方案1】:

在 cmets 中,您显示了您正在使用的路由器组件:Seriously Simple Router

解决方案是在控制器中访问这类信息,而不是在路由器中。以下示例显示了如何做到这一点:

// Wrap the whole url into the first capturing group to
// forward it to the controller
Router::route('(a/b/c/([\d]+))', function($url, $id) {
  var_dump(explode('/', $url));
});

Router::execute($_SERVER['REQUEST_URI']);

【讨论】:

  • 为什么? $parse_url['path'] === $_SERVER['REQUEST_URI'] - optional query
  • 可以使用 preg_match_all 吗?
  • @ hek2mgl 没有爆炸,preg_match_all,g,我只有 preg_match 可供使用
  • 那就没有机会了。路由器是你自己写的吗?
  • 为什么要在单独的匹配组中捕获这些 url 部分?
猜你喜欢
  • 1970-01-01
  • 2014-09-04
  • 2018-10-22
  • 2020-01-02
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多