Получение нескольких шаблонов с одинаковым именем

Что касается моего предыдущего сообщение Я пытаюсь сопоставить с регулярными выражениями все операторы использования в файле класса.

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

К сожалению, я не наделен всеми пространствами имен, используемыми в случае нескольких имен классов в одном операторе использования. Сохраняется только последний найденный.

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

Решение

Должен быть в состоянии использовать \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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]