Top.Mail.Ru
Ответы

Можете популярно объяснить чем отличается Preg_match_all от preg_match

В интернете есть описание , но я ничего не пойму из того что там написано. Слова вроде русские, но ничего не понятно

Дополнен

Особенно непонятно вот это:
-----------------------
"Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):

PREG_PATTERN_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так далее."
-------------------------

Дополнен
По дате
По рейтингу
Аватар пользователя
Новичок

Напишу как сам понимаю.

preg_match() ищет только первое соответствие в строке, preg_match_all() находит все. Как правильно ответил Редис Александрович, для простой проверки содержит ли строка шаблон достаточно preg_match().

Например есть строка $text = "param=1;param=2;param=3";

Нужно получить цифровые данные (1, 2, 3).

Если написать preg_match('/param=(\d+)/', $text, $matches) — в массиве $matches окажется только первый результат:
Array
(
[0] => param=1
[1] => 1
)

В первом элементе полное вхождение шаблона, во втором подмаска, т. е что обернули в круглые скобки.

Если изменить на preg_match_all получим все совпадения:
Array
(
[0] => Array
(
[0] => param=1
[1] => param=2
[2] => param=3
)

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

Флаг PREG_PATTERN_ORDER используется по умолчанию. Если по какой-то причине он неудобен для обработки данных можно использовать другой, например preg_match_all('/param=(\d+)/', $text, $matches, PREG_SET_ORDER) и получим:
Array
(
[0] => Array
(
[0] => param=1
[1] => 1
)

[1] => Array
(
[0] => param=2
[1] => 2
)

[2] => Array
(
[0] => param=3
[1] => 3
)

)

Аватар пользователя
Оракул

Ты меньше читай такие мануалы за 98 год. PHP итак неадекватный по историческим причинам, а такие документации написаны школьниками не добавять понимания
Если упростить preg_match позволяет узнать есть в строке подстрока или нет, а Preg_match_all позволит узнать конкретно места где есть совпадение.

Аватар пользователя
Мастер

Лично я интуитивно использую preg_match_all чтобы найти все совпадения полагая что all оно и есть all.
А если ищу ограниченное количество совпадений то preg_match