preg_grep()
En PHP, preg_grep() filtre un tableau en conservant uniquement les éléments correspondant à une expression régulière PCRE.
Introduction
preg_grep() filtre un tableau en ne conservant que les éléments qui correspondent (ou, en option, qui ne correspondent pas) à une expression régulière. C'est le membre orienté tableau de la famille PCRE de PHP : au lieu de tester une seule chaîne comme preg_match(), il parcourt chaque élément d'un tableau et retourne un nouveau tableau des éléments qui passent le test.
Cette page couvre la signature de la fonction et ses paramètres, la différence entre la correspondance normale et inversée, le comportement des clés retournées, les cas d'utilisation courants, ainsi que les pièges à éviter.
Syntaxe
preg_grep(string $pattern, array $array, int $flags = 0): array|falseLa fonction accepte trois paramètres :
$pattern— un pattern PCRE, écrit sous forme de chaîne avec des délimiteurs (par exemple/^g/,~\d+~,#error#i).$array— le tableau d'entrée à filtrer. Seules ses valeurs sont testées, jamais ses clés.$flags(optionnel) — passez la constantePREG_GREP_INVERTpour retourner les éléments qui ne correspondent pas. Par défaut à0(retourne les éléments correspondants).
La fonction retourne un nouveau tableau contenant les éléments correspondants, en préservant les clés d'origine. Si le pattern est invalide, elle retourne false et émet un avertissement.
Exemple de base
preg_grep() parcourt le tableau et conserve chaque valeur qui correspond au pattern. Ici, on ne garde que les couleurs qui commencent par la lettre g :
Résultat :
Array
(
[2] => green
)Notez la clé : green était à l'index 2 dans le tableau d'entrée, et preg_grep() conserve cette clé dans le résultat. Le tableau retourné n'est donc pas réindexé — si vous avez besoin de clés séquentielles, enveloppez l'appel dans array_values().
Filtrage avec PREG_GREP_INVERT
Passez PREG_GREP_INVERT en troisième argument pour inverser la logique : vous obtenez en retour les éléments qui ne correspondent pas au pattern. C'est utile pour les tâches du type « supprimer les mauvaises entrées ». Ici, on supprime toutes les chaînes contenant un chiffre :
<?php
$entries = ["apple1", "banana", "cherry7", "date", "fig2"];
$result = preg_grep("/[0-9]/", $entries, PREG_GREP_INVERT);
print_r($result);Résultat :
Array
(
[1] => banana
[3] => date
)Seuls banana et date survivent car ils ne contiennent aucun chiffre — et leurs clés d'origine (1 et 3) sont à nouveau préservées.
Cas d'utilisation pratiques
Filtrer les lignes de journal par niveau
Une tâche courante consiste à extraire uniquement les lignes d'erreur d'une liste d'entrées de journal. Un pattern ancré et sensible à la casse permet de rester précis :
<?php
$logs = [
"INFO ok",
"ERROR disk full",
"WARN low mem",
"ERROR timeout",
];
$errors = preg_grep("/^ERROR/", $logs);
print_r($errors);Résultat :
Array
(
[1] => ERROR disk full
[3] => ERROR timeout
)Conserver uniquement les chaînes entièrement numériques
Lors de la validation de données mixtes, preg_grep() vous permet de ne conserver que les valeurs correspondant à une forme stricte en une seule ligne. Les ancres ^\d+$ garantissent que la totalité de la chaîne est composée de chiffres :
<?php
$mixed = ["12", "ab", "3x", "99"];
$nums = preg_grep("/^\d+$/", $mixed);
print_r($nums);Résultat :
Array
(
[0] => 12
[3] => 99
)Pièges et conseils
- Les clés sont préservées, pas réinitialisées. Comme montré ci-dessus, des écarts dans les clés du résultat sont normaux. Utilisez
array_values()si vous avez besoin de0, 1, 2, …. - Seules les valeurs sont testées.
preg_grep()ignore entièrement les clés du tableau — il n'existe pas de variante basée sur les clés. - Les patterns invalides retournent
false, pas un tableau vide. Validez toujours le type du résultat si le pattern provient d'une entrée utilisateur :if ($result === false) { /* bad pattern */ }. - La fonction ne modifie pas le tableau d'entrée. Comme la plupart des helpers de tableaux PHP, elle retourne un nouveau tableau et laisse
$arrayinchangé. - Les valeurs non-string sont converties. Les nombres et autres scalaires sont convertis en chaînes avant la mise en correspondance, donc
preg_grep("/^1/", [10, 20])correspond à10.
Fonctions associées
preg_match()— tester une seule chaîne contre un pattern.preg_match_all()— trouver toutes les correspondances dans une seule chaîne.preg_replace()— rechercher et remplacer en utilisant un pattern.preg_split()— diviser une chaîne en tableau selon un pattern.preg_filter()— commepreg_replace()mais ne retourne que les sujets correspondants.
Conclusion
preg_grep() est la manière la plus simple de filtrer un tableau selon une expression régulière en PHP. Utilisez-la seule pour conserver les éléments correspondants, ajoutez PREG_GREP_INVERT pour les supprimer, et souvenez-vous qu'elle préserve les clés d'origine. Pour la correspondance sur une seule chaîne, utilisez preg_match() ; pour le remplacement, utilisez preg_replace().