$resultado = preg_match_all($pattern, $subject, $matches, $flags, $offset);

Explicando…

A função preg_match_all() relaciona todas as ocorrências ($matches) de um padrão ($pattern) em uma string ($subject).

A ordem do array resultado ($matches) é influenciado pelo 4º parâmetro ($flags).

O 5º parâmetro ($offset) indica em que posição, na string de pesquisa ($subject), a pesquisa deve iniciar.

Fonte: Gilmore (Dominando PHP e MYSQL, pag. 164)

Protótipo da função

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

Parâmetros

pattern

A expressão regular propriamente dita.

String de padrão de procura.

subject

Texto que será vasculhado por nossa expresão regular.

String de entrada.

matches (opcional)

Array multidimensional ordenado de acordo com o 4º parâmetro (`$flags`)

O que nossa expressão regular encontrou.

flags (opcional)

Define a ordem do array resultado (`$matches`), pode ser: `PREG_PATTERN_ORDER` ou `PREG_SET_ORDER`.

Quando omitido, o valor pardão é `PREG_PATTERN_ORDER`.

offset (opcional)

Indica em que posição, na string de pesquisa (`$subject`), a pesquisa deve iniciar.

Mais sobre o quarto parâmetro (flags)

Quando a flag é PREG_PATTERN_ORDER temos o seguinte quadro:

$matches[0] será um array com todas as ocorrências.

$matches[1] será um array com todas as ocorrências que combina com a primeira expressão em parênteses.

Exemplo:

<?php
$pattern = "|<[^>]+>(.*)]+>|U";
$subject = "<b>example: </b><div align=left>this is a test</div>";
preg_match_all($pattern, $subject, $matches, PREG_PATTERN_ORDER);
var_dump($matches);

Figura com o resultado de preg-pattern-order

Quando a flag é PREG_SET_ORDER temos o seguinte quadro:

$matches[0] será um array com elementos realcionados pela primeira expressão regular entre parênteses.

$matches[1] será um array com elementos relacionados pela segunda expressão regular entre parênteses.

<?php
$pattern = "|<[^>]+>(.*)]+>|U";
$subject = "<b>example: </b><div align=left>this is a test</div>";
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);
var_dump($matches);

Figura com o resultado de preg-set-order


Fonte