所以这就是问题,我使用preg_match来匹配浏览器中的当前URI,以及我在router.php配置文件中定义的URI。我正在构建类似于Django的Router / Dispatcher。
我想要的是preg_match()只捕获$ matches变量中的命名正则表达式。
所以,如果我有这样的正则表达式:
^(?<param1>[a-z]+(?:\-[a-z]+)*)\.domain\.com\/[a-z]+(?:\/)?(?<param2>[a-z]+)?\/?$
Rubural链接:CLICK
当我将当前URI与此正则表达式进行比较时,它匹配,但$ matches变量返回:
array ( 0 => 'sub.domain.com/page/pageurl/', 'param1' => 'sub', 1 => 'sub', 'param2' => 'pageurl', 2 => 'pageurl', )
是否可以告诉preg_match()
仅返回命名匹配,并排除那些数字匹配,我想得到的是关联数组:)
我可以使用foreach()
并循环$ match然后在里面检查它的数字是否有更好的方法?
由于
答案 0 :(得分:4)
我在PHP手册中找不到关于命名子模式的任何内容,但我会采取有根据的猜测并说你无法阻止生成数组中的数字键。
这种猜测的理由是,密钥0
始终包含完整匹配,并且无法命名匹配。
如果要删除数字索引,最好的方法可能是foreach
循环。
答案 1 :(得分:1)
试试这段代码:
$namedFields = array_filter(array_keys($matches), "is_string");
答案 2 :(得分:0)
$row = array_intersect_key(
$matches, // 4. "filling" flipped key array with actual values
array_flip( // 3. fliping array
array_filter( // 2. keeping string keys
array_keys($matches), // 1. taking keys
"is_string")));
也可以使用php5.6,你可以使用array_filter
$row = array_filter(
$matches,
'is_string',
ARRAY_FILTER_USE_KEY
);