preg_grep()
A função preg_grep() do PHP filtra arrays com expressões regulares, retornando os elementos que correspondem (ou não) ao padrão informado.
Introdução
preg_grep() filtra um array, mantendo apenas os elementos que correspondem (ou, opcionalmente, não correspondem) a uma expressão regular. É o membro orientado a arrays da família PCRE do PHP: em vez de testar uma única string como preg_match(), percorre cada elemento de um array e retorna um novo array com os elementos que passam no teste.
Esta página cobre a assinatura e os parâmetros da função, a diferença entre correspondência normal e invertida, como se comportam as chaves retornadas, usos práticos comuns e os cuidados a ter.
Sintaxe
preg_grep(string $pattern, array $array, int $flags = 0): array|falseA função aceita três parâmetros:
$pattern— um padrão PCRE, escrito como string com delimitadores (ex.:/^g/,~\d+~,#error#i).$array— o array de entrada a filtrar. Apenas seus valores são testados, nunca suas chaves.$flags(opcional) — passe a constantePREG_GREP_INVERTpara retornar os elementos que não correspondem. O padrão é0(retornar os elementos correspondentes).
Retorna um novo array contendo os elementos correspondentes, preservando as chaves originais. Se o padrão for inválido, retorna false e emite um aviso.
Exemplo básico
preg_grep() percorre o array e mantém cada valor que corresponde ao padrão. Aqui mantemos apenas as cores que começam com a letra g:
Saída:
Array
(
[2] => green
)Observe a chave: green estava no índice 2 no array de entrada, e preg_grep() mantém essa chave no resultado. O array retornado, portanto, não é reindexado — se precisar de chaves sequenciais, envolva a chamada em array_values().
Filtrando com PREG_GREP_INVERT
Passe PREG_GREP_INVERT como terceiro argumento para inverter a lógica: você recebe de volta os elementos que não passam no padrão. Isso é útil para tarefas do tipo "remover as entradas inválidas". Aqui descartamos todas as strings que contêm um dígito:
<?php
$entries = ["apple1", "banana", "cherry7", "date", "fig2"];
$result = preg_grep("/[0-9]/", $entries, PREG_GREP_INVERT);
print_r($result);Saída:
Array
(
[1] => banana
[3] => date
)Apenas banana e date sobrevivem porque não contêm dígitos — e, novamente, suas chaves originais (1 e 3) são preservadas.
Casos de uso práticos
Filtrando linhas de log por nível
Uma tarefa comum é extrair apenas as linhas de erro de uma lista de entradas de log. Um padrão ancorado sensível a maiúsculas mantém a precisão:
<?php
$logs = [
"INFO ok",
"ERROR disk full",
"WARN low mem",
"ERROR timeout",
];
$errors = preg_grep("/^ERROR/", $logs);
print_r($errors);Saída:
Array
(
[1] => ERROR disk full
[3] => ERROR timeout
)Mantendo apenas strings totalmente numéricas
Ao validar entradas mistas, preg_grep() permite manter apenas os valores que correspondem a um formato estrito em uma única linha. As âncoras ^\d+$ garantem que a string inteira seja composta de dígitos:
<?php
$mixed = ["12", "ab", "3x", "99"];
$nums = preg_grep("/^\d+$/", $mixed);
print_r($nums);Saída:
Array
(
[0] => 12
[3] => 99
)Cuidados e dicas
- As chaves são preservadas, não redefinidas. Como mostrado acima, lacunas nas chaves do resultado são normais. Use
array_values()se precisar de0, 1, 2, …. - Apenas os valores são testados.
preg_grep()ignora completamente as chaves do array — não existe uma variante baseada em chaves. - Padrões inválidos retornam
false, não um array vazio. Sempre valide o tipo do resultado se o padrão vier de entrada do usuário:if ($result === false) { /* bad pattern */ }. - Não modifica o array de entrada. Como a maioria dos auxiliares de array do PHP, retorna um novo array e deixa
$arrayintacto. - Valores não-string são convertidos. Números e outros escalares são convertidos para string antes da correspondência, então
preg_grep("/^1/", [10, 20])corresponde a10.
Funções relacionadas
preg_match()— testa uma única string contra um padrão.preg_match_all()— encontra todas as correspondências dentro de uma string.preg_replace()— pesquisa e substitui usando um padrão.preg_split()— divide uma string em um array por um padrão.preg_filter()— comopreg_replace(), mas retorna apenas os sujeitos correspondidos.
Conclusão
preg_grep() é a forma mais limpa de filtrar um array com uma expressão regular em PHP. Use-a sozinha para manter os elementos correspondentes, adicione PREG_GREP_INVERT para removê-los e lembre-se de que ela preserva as chaves originais. Para correspondência em uma única string, use preg_match(); para substituição, use preg_replace().