W3docs

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|false

La 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 constante PREG_GREP_INVERT pour 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 :

php— editable, runs on the server

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 de 0, 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 $array inchangé.
  • 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() — comme preg_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().

Pratique

Pratique
Quelle est la fonction de preg_grep en PHP ?
Quelle est la fonction de preg_grep en PHP ?
Was this page helpful?