在一行中查找多个正则表达式匹配

时间:2016-06-20 21:08:55

标签: php regex

至于练习和后期开发,我正在开发一个PHP路由器。对于这个路由器,我的映射路由可以包含参数,路由如下:

  

/家庭/ {I:页次} / {S:用户名}

此路线中现在有两个变量:

  • pageNum变量,它是一个int类型
  • userName变量,为字符串类型

为了捕获这些数据,我写了这个正则表达式:

{((?<type>\D):)?(?<name>[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]+)}

这很好用,但唯一的问题是它只捕获第一个变量。

当我在新线路上放置新路线时,它只捕获更多这些匹配。

我尝试通过()来包围整个正则表达式。这没用。

如何制作这个正则表达式,以便在一行文本中捕获更多匹配项?

为了调用这个正则表达式,我使用以下PHP函数:

preg_match("/{((?<type>\D):)?(?<name>[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]+)}/", "/home/{i:pageNum}/{s:userName}", $matches);

1 个答案:

答案 0 :(得分:0)

只需使用preg_match_all()PREG_SET_ORDER

preg_match_all("/{((?<type>\D):)?(?<name>[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]+)}/",
               "/home/{i:pageNum}/{s:userName}",
               $matches,
               PREG_SET_ORDER);

然后:

foreach($matches as $match) {
    echo $match['name'] . ' = ' . $match['type'];
}

使用您可以执行的默认PREG_PATTERN_ORDER

$matches = array_combine($matches['name'], $matches['type']);

foreach($matches as $name => $type) {
    echo "$name = $type";
}