从regexp中的多个匹配中捕获URL ID

时间:2017-02-17 16:30:54

标签: php regex preg-match

我正在编写一个简单的URL解析器。 正如下面的正则表达式

preg_match_all('/^test\/(\w+)\/?$/', $url, $matches);

我可以抓住所有网址

test/5

并浏览$ matches数组我可以获得ID,即5。那没关系。

使用如下的正则表达式

preg_match_all('/^test\/((\w+)\/?)+\/(\w+)\/?$/', $url, $matches);

我可以抓住所有网址

test/1/5
test/1/2/5
test/1/2/3/5

......等等。 问题是浏览$matches数组我无法捕获可变长度部分的所有匹配ID(((\w+)\/?)+)。我的意思是我没有捕获1,2,3但是3, 3,3。我得到最后一次ID重复N次。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我会分两步完成这项工作。

首先,您可以检查网址格式:

^test(?:\/\d+)+$

See the demo

然后,如果测试成功,您可以使用此正则表达式提取ID:

(?:\G|^test)\/\K\d+

输出数组只包含ID See the demo

解释

  • (?:\G|^test)匹配字符串开头的上一场比赛 test的结束位置
  • \//
  • 相匹配
  • \K重置当前比赛的起点,此处不包括结果中的/
  • \d+匹配1位或更多位数