(PHP 5 >= 5.3.0, PHP 7, PHP 8)
preg_filter — Executa pesquisa e substituição usando expressões regulares
$pattern
$replacement
$subject
$limit
&$count
null
preg_filter() é idêntica a preg_replace() exceto que ela somente retorna strings de entrada (possivelmente transformadas) onde ocorreu uma correspondência. Para detalhes sobre como esta função trabalha, leia a documentação sobre preg_replace().
Parâmetros estão descritos na documentação sobre preg_replace().
Retorna um array se o parâmetro subject for um array, ou uma string caso contrário.
subject
Se nenhuma correspondência for encontrada ou se ocorrer um erro, um array vazio é retornado quando subject for um array ou null caso contrário.
Se o padrão de expressão regular passado não for compilado para uma expressão regular válida, um E_WARNING será emitido.
E_WARNING
Exemplo #1 Exemplo comparando preg_filter() com 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 retorna\n";print_r(preg_filter($pattern, $replace, $subject));echo "preg_replace retorna\n";print_r(preg_replace($pattern, $replace, $subject));?>
O exemplo acima produzirá:
preg_filter retorna Array ( [0] => A:C:1 [1] => B:C:a [2] => A:2 [3] => B:b [4] => A:3 [7] => A:4 ) preg_replace retorna 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 ; } }?>