Comprendre la fonction preg_filter en PHP
La fonction preg_filter en PHP permet de rechercher et remplacer du texte correspondant à une expression régulière, en ne retournant que les entrées correspondantes.
La fonction preg_filter en PHP recherche dans une chaîne de caractères (ou un tableau de chaînes) du texte correspondant à une expression régulière et le remplace. Sa caractéristique principale est qu'elle ne retourne que les entrées où une correspondance a été trouvée — les entrées sans correspondance sont supprimées. Elle est donc idéale pour les cas où vous souhaitez rechercher, remplacer et filtrer en une seule étape.
Si vous avez déjà utilisé preg_replace, preg_filter vous semblera familière : la syntaxe est identique. La seule différence de comportement — ce qui se passe avec les sujets sans correspondance — est ce qui rend preg_filter intéressante, et c'est le sujet de cette page.
Dans cet article, nous allons aborder la syntaxe, les paramètres, les différences entre preg_filter et preg_replace, ainsi que les cas d'utilisation les plus courants, chacun accompagné d'un exemple exécutable.
Syntaxe et paramètres
La syntaxe de la fonction preg_filter est la suivante :
Syntaxe PHP preg_filter
preg_filter(pattern, replacement, subject [, limit [, count]])Les paramètres sont les suivants :
pattern: Il s'agit d'un motif d'expression régulière qui spécifie le texte à rechercher.replacement: Il s'agit du texte qui remplacera le texte correspondant dans le sujet.subject: Il s'agit de la chaîne dans laquelle vous souhaitez rechercher et remplacer du texte.limit(optionnel) : Le nombre maximum de remplacements par chaîne sujet. Par défaut à-1(sans limite).count(optionnel) : Une variable passée par référence qui sera remplie avec le nombre total de remplacements effectués.
Les arguments pattern, replacement et subject peuvent chacun être une valeur unique ou un tableau, exactement comme avec preg_replace. La valeur de retour est une chaîne lorsque subject est une chaîne, et un tableau lorsque subject est un tableau.
preg_filter vs. preg_replace
Les deux fonctions prennent les mêmes arguments et effectuent le même travail de recherche-remplacement. La différence réside dans ce qu'elles retournent lorsqu'un sujet ne correspond pas au motif :
preg_replaceretourne le sujet inchangé.preg_filterretournenullpour un sujet de type chaîne, et omet entièrement l'entrée pour un sujet de type tableau.
<?php
$input = ["123", "abc", "456"];
// preg_replace keeps every element, matched or not.
print_r(preg_replace("/\d+/", "[num]", $input));
// Array ( [0] => [num] [1] => abc [2] => [num] )
// preg_filter drops the non-matching "abc".
print_r(preg_filter("/\d+/", "[num]", $input));
// Array ( [0] => [num] [2] => [num] )
?>Remarquez que preg_filter préserve les clés d'origine (0 et 2) — elle ne réindexe pas le tableau.
Cas d'utilisation
preg_filter est particulièrement utile lorsque vous avez besoin de rechercher, remplacer et filtrer en même temps. Les cas d'utilisation courants incluent :
- Filtrage de tableaux : Passez un tableau de chaînes et récupérez uniquement les éléments qui correspondent au motif.
- Suppression de balises HTML : Supprimez les balises des chaînes ou des tableaux de chaînes.
- Extraction et reformatage : Remplacez le texte correspondant tout en supprimant les entrées qui ne présentent aucun intérêt.
Exemple : Suppression des balises HTML
Dans cet exemple, nous allons utiliser preg_filter pour supprimer les balises HTML d'une chaîne :
Exemple PHP preg_filter
Dans cet exemple, nous utilisons le motif d'expression régulière /<[^>]+>/ pour faire correspondre toutes les balises HTML dans la chaîne $html. Le paramètre replacement est défini comme une chaîne vide, de sorte que le texte correspondant est supprimé. Le texte résultant est ensuite stocké dans la variable $text et affiché à l'écran.
Exemple : Filtrage des éléments d'un tableau
preg_filter est particulièrement efficace avec les tableaux car elle supprime les éléments sans correspondance :
<?php
$items = ["apple", "banana", "apricot", "cherry"];
$filtered = preg_filter("/^a/", "A", $items);
print_r($filtered);
// Outputs:
// Array
// (
// [0] => Apple
// [2] => Apricot
// )
?>Dans cet exemple, preg_filter remplace le "a" initial par "A" mais supprime automatiquement "banana" et "cherry" car ils ne correspondent pas au motif. Les éléments conservés gardent leurs clés d'origine (0 et 2).
Compter les remplacements avec le paramètre count
Le cinquième paramètre optionnel est rempli par référence avec le nombre de remplacements effectués, ce qui est pratique pour les rapports ou pour déterminer si une correspondance a eu lieu :
<?php
$subject = "Order #42 and order #7";
$result = preg_filter("/#(\d+)/", "[$1]", $subject, -1, $count);
echo $result . "\n"; // Order [42] and order [7]
echo $count . "\n"; // 2
?>Ici, $1 dans le remplacement est une référence arrière vers le premier groupe de capture. Deux correspondances ont été remplacées, donc $count vaut 2.
Conclusion
preg_filter effectue une recherche et un remplacement par expression régulière tout comme preg_replace, mais supprime les sujets sans correspondance — retournant null pour les chaînes et écartant les éléments sans correspondance des tableaux. C'est donc le bon choix lorsque le filtrage et le remplacement doivent être effectués en une seule étape.
Pour approfondir l'utilisation des expressions régulières en PHP, consultez preg_match pour tester une seule correspondance, preg_match_all pour trouver toutes les correspondances, preg_split pour diviser des chaînes, et preg_replace_callback lorsque le remplacement doit être calculé par du code.