我正在尝试将URI转换为我创建的URI类中的键和值对。URI是干净的,不能解析为$_GET变量。解决方案必须在PHP中,而不是在Apache的mod_rewrite中。
考虑这个URI:/category/music/rows=30/page=12/
我想要的键值对如下:
数组("类别"、"音乐"、"行"、"30"、"页面"、"12")
为了尝试实现这一点,我写了以下示例代码:
$arr = array();
preg_match('/(category'/(?<category>['w-_]+)|rows=(?<rows>'d+)|page=(?<page>'d+))+/',
"category/music/rows=30/page=12", $arr);
var_dump($arr);
输出:
array
0 => string 'category/music' (length=14)
1 => string 'category/music' (length=14)
'category' => string 'music' (length=5)
2 => string 'music' (length=5)
当时的想法是,我想一次或多次匹配组中的任何一个(/(匹配这个|或这个|或这)+/)。我假设这里的问题是它匹配一次,然后停止。此外,对或语句进行分组的括号会导致不需要存储的匹配(不需要字符串"category/music")。
我可能错过了一些显而易见的东西,但我想不通。我意识到我可以跑三次preg_match,但似乎必须有办法用一个表达式来做到这一点。我还想保持代码简短。
编辑:preg_match_all有效,我已经将regex修改为:
/类别/(?[''w-_]+)|行=(?''d+)|页=(?[d+)/
然而,我现在得到的结果是:
array
0 =>
array
0 => string 'category/music' (length=14)
1 => string 'rows=30' (length=7)
2 => string 'page=12' (length=7)
'category' =>
array
0 => string 'music' (length=5)
1 => string '' (length=0)
2 => string '' (length=0)
1 =>
array
0 => string 'music' (length=5)
1 => string '' (length=0)
2 => string '' (length=0)
'rows' =>
array
0 => string '' (length=0)
1 => string '30' (length=2)
2 => string '' (length=0)
2 =>
array
0 => string '' (length=0)
1 => string '30' (length=2)
2 => string '' (length=0)
'page' =>
array
0 => string '' (length=0)
1 => string '' (length=0)
2 => string '12' (length=2)
3 =>
array
0 => string '' (length=0)
1 => string '' (length=0)
2 => string '12' (length=2)
如果它不同时存储"类别/音乐"、"行+30"、"page=12",那将是理想的选择。它还匹配了许多不必要的空白字符串。
尝试使用preg_match_all
,看看这是否有帮助。preg_match
在找到第一个匹配之后停止。
要摆脱匹配1("类别/音乐"),请尝试使用非捕获组,也可以这样做:
(?:category'/(?<category>['w-_]+)
而不是
(category'/(?<category>['w-_]+)