获取具有相同名称的多个子模式

时间:2015-01-29 04:08:56

标签: php regex preg-match pcre

关于我以前的post我试图与正则表达式匹配,所有都使用类文件中的语句。

<?php
use Vendor\ProjectArticle\Model\Peer,
    Vendor\Library\Template;
use Vendor\Blablabla;

$file = file_get_contents($class_path);
$a = preg_match_all('#use (?:(?<ns>[^,;]+),?)+;#mi', $file, $use);
var_dump(array('$a' => $a, '$use' => $use));

不幸的是,我不喜欢在一个use语句中使用多个类名的所有名称空间。只存储匹配的最后一个。

Array
(
    [$a] => 2
    [$use] => Array
        (
            [0] => Array
                (
                    [0] => use Vendor\ProjectArticle\Model\Peer,
    Vendor\Library\Template;
                    [1] => use Vendor\Blablabla;
                )

            [ns] => Array
                (
                    [0] => 
    Vendor\Library\Template
                    [1] => Vendor\Blablabla
                )

            [1] => Array
                (
                    [0] => 
    Vendor\Library\Template
                    [1] => Vendor\Blablabla
                )
        )
)

这可以通过一些模式修饰符来完成吗?

〜感谢

1 个答案:

答案 0 :(得分:1)

应该可以使用\G锚点。

 # '~(?:(?!\A)\G|^Use\s+),?\s*(?<ns>[^,;]+)(?=(?:,|[^,;]*)*;)~mi'

 (?xmi-)                       # Inline modifier = expanded, multiline, case insensitive
 (?:
      (?! \A )                      # Not beginning of string
      \G                            # If matched before, start at end of last match
   |                              # or,
      ^ Use \s+                     # Beginning of line then 'Use' + whitespace 
 )

 ,? \s*                        # Whitespace trim
 (?<ns> [^,;]+ )               # (1), A namespace value

 (?=                           # Lookahead, each match validates a final ';'
      (?: , | [^,;]* )*
      ;
 )

输出:

 **  Grp 0 -  ( pos 0 , len 36 ) 
use Vendor\ProjectArticle\Model\Peer
 **  Grp 1 -  ( pos 4 , len 32 ) 
Vendor\ProjectArticle\Model\Peer

---------------------

 **  Grp 0 -  ( pos 36 , len 30 ) 
,
    Vendor\Library\Template
 **  Grp 1 -  ( pos 43 , len 23 ) 
Vendor\Library\Template

---------------------

 **  Grp 0 -  ( pos 69 , len 20 ) 
use Vendor\Blablabla
 **  Grp 1 -  ( pos 73 , len 16 ) 
Vendor\Blablabla