2012-02-19 31 views
2

所以这就是我使用preg_match将浏览器中的当前URI与我的router.php配置文件中定义的URL进行匹配的问题。我建立类似于Django的Router/Dispatcher。PHP的preg_match,如何捕获只命名的正则表达式?

我想要的是,preg_match()只捕获$ matches变量中的命名正则表达式。

所以如果我有regexs这样的:

^(?<param1>[a-z]+(?:\-[a-z]+)*)\.domain\.com\/[a-z]+(?:\/)?(?<param2>[a-z]+)?\/?$ 

Rubural链接:CLICK

当我比较当前URI与此regexs匹配,但$变量返回此匹配:

array (0 => 'sub.domain.com/page/pageurl/', 'param1' => 'sub', 1 => 'sub', 'param2' => 'pageurl', 2 => 'pageurl',) 

是否可以告知preg_match()仅返回指定的匹配项,并排除那些数字,我想得到的是关联数组:)

我可以使用foreach()并通过$匹配循环,然后在里面检查它的数字或不...有没有更好的办法?

感谢

+2

没有一个'array_filter_keys'功能,所以你可能是最好的只是做循环。 – lonesomeday 2012-02-19 21:52:09

+0

array_filter_keys可以这样做:'array_intersect_key($ matches,array_flip(array('param1','param2')))' – 2012-06-29 14:51:36

回答

4

我无法找到有关摆在首位命名子模式的PHP手册什么,但我会采取一种猜测,说你不能防止数字键产生阵列。

这种猜测的理由是钥匙0始终包含完整匹配,并且没有匹配的命名方式。

如果你想删除数字指数,最好的方法可能是foreach循环。

+1

http://php.net/manual/en/regexp.reference.subpatterns.php>可以使用语法命名子模式(?P 模式)。然后,这个子模式将通过正常的数字位置和名称在匹配数组中进行索引。 PHP 5.2.2引入了两种替代语法(?模式)和(?'name'pattern)。' – Vyktor 2012-02-19 21:59:51

+0

感谢球员们,il留下了索引值和联想值。谁知道谁会使用这个Dispatcher,所以最好留下这两个选项。 – Limeni 2012-02-19 22:04:02

1

试试这个代码:

$namedFields = array_filter(array_keys($matches), "is_string"); 
+0

以上不适合我。相反,请尝试:array_filter($ matches,“is_string”,ARRAY_FILTER_USE_KEY); – Cedric 2017-09-15 09:53:34

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