(PHP 5 >= 5.3.0, PHP 7, PHP 8)
preg_filter — Recherche et remplace avec une expression rationnelle
$pattern
$replacement
$subject
$limit
&$count
null
preg_filter() est identique à preg_replace(), mais elle ne fait que retourner les occurrences trouvées (éventuellement transformées). Pour plus de détails sur le fonctionnement de cette fonction, voyez preg_replace().
Les paramètres sont décrits dans la documentation de preg_replace().
Retourne un tableau si le paramètre subject est de type tableau ou une chaîne de caractères autrement.
subject
Si aucune occurrence n'est trouvée ou si une erreur survient, un tableau vide sera retourné lorsque le paramètre subject est un tableau ou null sinon.
Si le masque regex passé ne compile pas à une regex valide, une E_WARNING est émise.
E_WARNING
Exemple #1 Exemple de comparaison de preg_filter() avec preg_replace()
<?php$subject = array('1', 'a', '2', 'b', '3', 'A', 'B', '4'); $pattern = array('/\d/', '/[a-z]/', '/[1a]/'); $replace = array('A:$0', 'B:$0', 'C:$0'); echo "preg_filter renvoie\n";print_r(preg_filter($pattern, $replace, $subject)); echo "preg_replace renvoie\n";print_r(preg_replace($pattern, $replace, $subject)); ?>
L'exemple ci-dessus va afficher :
preg_filter renvoie Array ( [0] => A:C:1 [1] => B:C:a [2] => A:2 [3] => B:b [4] => A:3 [7] => A:4 ) preg_replace renvoie Array ( [0] => A:C:1 [1] => B:C:a [2] => A:2 [3] => B:b [4] => A:3 [5] => A [6] => B [7] => A:4 )
For those who read manual not in English and figure out that example code returns not the same result as in documentationYou need put in example patter modifier "u" to get same result:<?php$subject = array('1', 'а', '2', 'б', '3', 'А', 'Б', '4');// Added "u"$pattern = array('/\d/u', '/[а-я]/u', '/[1а]/u');$replace = array('А:$0', 'Б:$0', 'В:$0');?>
If you don't want to actually replace the matches, just filter the array to them, make the replacement parameter '$0'.<?php$subject = array('1', 'a', '2', 'b', '3', 'A', 'B', '4'); $result = preg_filter('/\d/', '$0', $subject); // ['1','2','3','4']?>
As I had to work with PHP5.2.X and needed preg_filter I wrote a quick and dirty workaround.<?php if (!function_exists('preg_filter')) { function preg_filter($pattern, $replace, $subject, $limit = -1 , &$count = null) { if(!is_array($subject)) { $noArray = 1 ; $subject = array($subject); } $preg = preg_replace($pattern, $replace, $subject, $limit, &$count); $diff = array_diff($preg, $subject); if($noArray == 1) $diff = implode($diff) ; return $diff ; } }?>