PHP preg_match: совпадения нескольких групп с модификатором + или * не отображаются в результате? - PullRequest
0 голосов
/ 06 февраля 2019

Если я сделаю это в PHP:

$str = "abc pqrs-1/2&3uvw xyz";
preg_match( "/([a-z]+)([^0-9a-z][0-9])+([a-z]+)/" , $str , $m );

Полученные совпадения в $m будут:

[0] => "pqrs-1/2&3uvw"
[1] => "pqrs"
[2] => "&3"
[3] => "uvw"

Обратите внимание, как часть ([^0-9a-z][0-9])+, которая должнапоймать "один не буквенно-цифровой символ, а затем купить одну цифру" один или несколько раз, имеет модификатор + вне скобок.

Очевидно, что строка субъекта $str содержит 3 соответствия для этого шаблона: -1 и /2 и &3, но она запоминает только last .

Есть ли способ как-нибудь поймать их всех?

Я попытался preg_match_all вместо preg_match, но он найдет только несколько совпадений, если регулярное выражение whole встречается более одного раза в строке темы.

Для вербализации значения моего регулярного выражения:

  1. одна или несколько букв
  2. одна или несколько из: не алфавитно-цифровой символ, за которым следует цифра
  3. одна или несколько букв

Так что для приведенного выше примера строки я ожидаю, что результат будет примерно таким:

[0] => "pqrs-1/2&3uvw"
[1] => "pqrs"
[2] => [ "-1" , "/2" , "&3" ]
[3] => "uvw"

Но что бы я ни пытался,Я не могу заставить его также дать -1 и /2 совпадения?

1 Ответ

0 голосов
/ 07 февраля 2019

Нельзя сопоставлять повторяющиеся подстроки с повторяющимися группами захвата.Вместо этого вам нужно сделать это, используя двухэтапный подход:

  • Используйте /([a-z]+)((?:[^0-9a-z][0-9])+)([a-z]+)/ регулярное выражение для сопоставления и захвата с ((?:[^0-9a-z][0-9])+) всеми повторениями (?:[^0-9a-z][0-9])pattern
  • Затем используйте preg_match_all с групповым шаблоном, '/[^0-9a-z][0-9]/'.

PHP демо :

$str = "abc pqrs-1/2&3uvw xyz";
if (preg_match('~([a-z]+)((?:[^0-9a-z][0-9])+)([a-z]+)~', $str, $matches)) {
    preg_match_all('~[^0-9a-z][0-9]~', $matches[2], $x);
    $matches[2] = $x[0];
}
print_r($matches);

Вывод:

Array
(
    [0] => pqrs-1/2&3uvw
    [1] => pqrs
    [2] => Array
        (
            [0] => -1
            [1] => /2
            [2] => &3
        )

    [3] => uvw
)
...