至于练习和后期开发,我正在开发一个PHP路由器。对于这个路由器,我的映射路由可以包含参数,路由如下:
/家庭/ {I:页次} / {S:用户名}
此路线中现在有两个变量:
为了捕获这些数据,我写了这个正则表达式:
{((?<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);
答案 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";
}