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

Getting multiple subpatterns with the same name

关于我之前的 我正在尝试用正则表达式匹配 class 文件中的所有 use 语句。

<?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 语句中有多个 class 名称的情况下,我无法使用所有命名空间。仅存储最后一个匹配项。

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

这可以通过一些模式修改器或其他东西来完成吗?

~谢谢

应该可以为此使用 \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