preg_last_error
preg_match
PCRE
PHP Manual

# preg_match_all

(PHP 4, PHP 5)

preg_match_all — Выполняет глобальный поиск шаблона в строке

### Описание

int preg_match_all ( string `$pattern` , string `$subject` , array `$&matches` [, int `$flags` [, int `$offset` ]] )

Ищет в строке `subject` все совпадения с шаблоном `pattern` и помещает результат в массив `matches` в порядке, определяемом комбинацией флагов `flags` .

После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.

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

PREG_PATTERN_ORDER

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

  `<?php
  preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
  "<b>example: </b><div align=left>this is a test</div>",
  $out, PREG_PATTERN_ORDER);
  echo $out[0][0] . ", " . $out[0][1] . "\n";
  echo $out[1][0] . ", " . $out[1][1] . "\n";
  ?>`

  Результат работы примера:

      <b>example: </b>, <div align=left>this is a test</div>
      example: , this is a test

  Как мы видим, $out[0] содержит массив полных вхождений шаблона, а элемент $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER

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

  `<?php
  preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
  "<b>example: </b><div align=\"left\">this is a test</div>",
  $out, PREG_SET_ORDER);
  echo $out[0][0] . ", " . $out[0][1] . "\n";
  echo $out[1][0] . ", " . $out[1][1] . "\n";
  ?>`

  Результат работы примера:

      <b>example: </b>, example:
      <div align="left">this is a test</div>, this is a test

  В таком случае массив $matches[0] содержит первый набор вхождений, а именно: элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.

PREG_OFFSET_CAPTURE

  В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом - смещение. Данный флаг доступен в PHP 4.3.0 и выше.

В случае, если никакой флаг не используется, по умолчанию используется `PREG_PATTERN_ORDER`.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр `offset` может быть использован для указания альтернативной начальной позиции для поиска. Дополнительный параметр `offset` доступен, начиная с PHP 4.3.3.

> Замечание: Использование параметра `offset` не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match_all(), поскольку шаблон `pattern` может содержать такие условия как ^, $ или (?<=x). Вы можете найти соответствующие примеры в описании функции preg_match().

Возвращает количество найденных вхождений шаблона (может быть нулем) либо `FALSE`, если во время выполнения возникли какие-либо ошибки.

Пример #1 Получение всех телефонных номеров из текста.

`<?php
preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
"Call 555-1212 or 1-800-555-1212", $phones);
?>`

Пример #2 Жадный поиск совпадений с HTML-тэгами

`<?php
// Запись \\2 является примером использования ссылок на подмаски.
// Она означает необходимость соответствия подстроки строке, зафиксированной
// второй подмаской, в нашем примере это ([\w]+).
// Дополнительный слеш необходим, так как используются двойные кавычки.
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: " . $matches[0][$i] . "\n";
echo "part 1: " . $matches[1][$i] . "\n";
echo "part 2: " . $matches[3][$i] . "\n";
echo "part 3: " . $matches[4][$i] . "\n\n";
}
?>`

Результат работы примера:

    matched: <b>bold text</b>
    part 1: <b>
    part 2: bold text
    part 3: </b>

    matched: <a href=howdy.html>click me</a>
    part 1: <a href=howdy.html>
    part 2: click me
    part 3: </a>

Смотрите также preg_match(), preg_replace(), и preg_split().

preg_last_error
preg_match
PCRE
PHP Manual