preg_filter
(PHP 5 >= 5.3.0)
preg_filter — Perform a regular expression search and replace
Description
$pattern
, mixed $replacement
, mixed $subject
[, int $limit
= -1
[, int &$count
]] )preg_filter() is identical to preg_replace() except it only returns the (possibly transformed) subjects where there was a match. For details about how this function works, read the preg_replace() documentation.
Return Values
Returns an array if the subject
parameter is an array, or a string otherwise.
If no matches are found or an error occurred, an empty array
is returned when subject
is an array
or NULL
otherwise.
Examples
Example #1 Example comparing preg_filter() with 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 returns\n";
print_r(preg_filter($pattern, $replace, $subject));
echo "preg_replace returns\n";
print_r(preg_replace($pattern, $replace, $subject));
?>
The above example will output:
preg_filter returns Array ( [0] => A:C:1 [1] => B:C:a [2] => A:2 [3] => B:b [4] => A:3 [7] => A:4 ) preg_replace returns 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 )
See Also
- PCRE Patterns
- preg_replace() - Perform a regular expression search and replace
- preg_replace_callback() - Perform a regular expression search and replace using a callback
- preg_grep() - Return array entries that match the pattern
- preg_last_error() - Returns the error code of the last PCRE regex execution
Коментарии
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 ;
}
}
?>
For those who read manual not in English and figure out that example code returns not the same result as in documentation
You 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']
?>