Я пытаюсь получить все подстроки, соответствующие мультипликатору:
$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 ()?