(PHP 5 >= 5.3.0, PHP 7, PHP 8)
preg_filter — Производит поиск и замену по регулярному выражению
$pattern,$replacement,$subject,$limit = -1,&$count = null Функция preg_filter() идентична функции preg_replace() за исключением того, что возвращает только те значения (возможно, преобразованные), в которых найдено совпадение. Подробнее о работе функции читайте в документации к preg_replace() .
Параметры описаны в документации для функции preg_replace() .
Возвращает массив (array ), если аргумент subject
имеет тип array или строка (string ) в противном случае.
Если совпадений не найдено или возникла ошибка, возвращается пустой массив
(array ), когда subject
имеет тип array или null в противном случае.
Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение,
выдаётся ошибка уровня E_WARNING .
Пример #1 Пример для сравнения функций preg_filter() и preg_replace()
<?php
$subject = array('1', 'а', '2', 'б', '3', 'А', 'Б', '4');
$pattern = array('/\d/', '/[а-я]/', '/[1а]/');
$replace = array('А:0ドル', 'Б:0ドル', 'В:0ドル');
echo "preg_filter возвращает\n";
print_r(preg_filter($pattern, $replace, $subject));
echo "preg_replace возвращает\n";
print_r(preg_replace($pattern, $replace, $subject));
?>Результат выполнения приведённого примера:
preg_filter возвращает Array ( [0] => А:В:1 [1] => Б:В:а [2] => А:2 [3] => Б:б [4] => А:3 [7] => А:4 ) preg_replace возвращает Array ( [0] => А:В:1 [1] => Б:В:а [2] => А:2 [3] => Б:б [4] => А:3 [5] => А [6] => Б [7] => А:4 )
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']
?>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 ;
}
}
?>