Получите повторные совпадения с preg_match_all ()

Я пытаюсь получить все подстроки, соответствующие мультипликатору:

$list = '1,2,3,4'; preg_match_all('|\d+(,\d+)*|', $list, $matches); print_r($matches); 

Этот пример возвращает, как и ожидалось, последнее совпадение в [1] :

 Array ( [0] => Array ( [0] => 1,2,3,4 ) [1] => Array ( [0] => ,4 ) ) 

Тем не менее, я хотел бы получить все строки, соответствующие (,\d+) , чтобы получить что-то вроде:

 Array ( [0] => ,2 [1] => ,3 [2] => ,4 ) 

Есть ли способ сделать это с помощью одной функции, такой как preg_match_all() ?

Согласно Коби (см. Комментарии выше):

PHP не поддерживает захваты одной и той же группы

Поэтому этот вопрос не имеет решения.

Использование lookbehind – способ сделать работу:

 $list = '1,2,3,4'; preg_match_all('|(?<=\d),\d+|', $list, $matches); print_r($matches); 

Все ,\d+ находятся в группе 0.

вывод:

 Array ( [0] => Array ( [0] => ,2 [1] => ,3 [2] => ,4 ) ) 

Вы не можете использовать раскол , как сказал Коби.

Почему не просто:

 $ar = explode(',', $list); print_r($ar); 

Разделение – это только вариант, когда символ для разделения не используется в шаблонах, чтобы соответствовать самому себе. У меня была ситуация, когда сильно отформатированная запятая была разделена на одну из нескольких известных опций.

т.е. варианты '1,2', '2', '2,3' subject '1,2,3'.

Разделение на «,» приведет к «1», «2» и «3»; только один ('2') которого является допустимым совпадением, это происходит потому, что разделитель также является частью опций.

Наивное регулярное выражение было бы чем-то вроде ~ ~ (1,2 | 2 | 2,3) (?:, (1,2 | 2 | 2,3)) * $ ~ i ', но это сталкивается с проблемой захваты одной группы.

Моим «решением» было просто расширить регулярное выражение, чтобы оно соответствовало максимальному количеству совпадений: «~ ^ (1,2 | 2 | 2,3) (?:, (1,2 | 2 | 2,3))? (?:, (1,2 | 2 | 2,3))? $ ~ I '(если доступно больше опций, просто повторите' (?:, (1,2 | 2 | 2,3))? ' бит. Это приводит к пустым результатам строки для «неиспользуемых» совпадений.

Это не самое чистое решение, но работает, когда вам приходится иметь дело с плохо отформатированными входными данными.

С http://www.php.net/manual/en/regexp.reference.repetition.php :

Когда повторный подзапрос захвата повторяется, полученное значение представляет собой подстроку, которая соответствует последней итерации.

Также подобная тема:

Как получить все привязки матчей подгрупп с preg_match_all ()?