PHP preg_match,如何只捕获命名的正则表达式?

时间:2012-02-19 21:47:44

标签: php

所以这就是问题,我使用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然后在里面检查它的数字是否有更好的方法?

由于

3 个答案:

答案 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
);