PCRE
PHP Manual

preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5)

preg_replace_callbackВыполняет поиск по регулярному выражению и замену с использованием callback-функции

Описание

mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )

Поведение этой функции во многом напоминает preg_replace(), за исключением того, что вместо параметра replacement необходимо указывать callback-функцию.

Список параметров

pattern

Искомый шаблон. Может быть как строкой, так и массивом строк.

callback

Вызываемая callback-функция, которой будет передан массив совпавших элементов из строки subject. Callback-функция должна вернуть строку с заменой.

Достаточно часто callback функция, кроме как в вызове preg_replace_callback(), ни в чем больше не участвует. Исходя из этих соображений, можно использовать анонимные функции (начиная с версии PHP 5.3.0) или create_function() для создания безымянной callback-функции непосредственно в вызове preg_replace_callback(). Если вы используете такой подход, вся информация, связанная с заменой по регулярному выражению, будет собрана в одном месте, и пространство имен функций не будет загромождаться неиспользуемыми записями.

Пример #1 preg_replace_callback() и create_function()

<?php
/* фильтр, подобный тому, что используется в системах Unix
 * для преобразования заглавных букв в началье параграфа в строчные */
$fp fopen("php://stdin""r") or die("не удалось прочесть stdin");
while (!
feof($fp)) {
    
$line fgets($fp);
    
$line preg_replace_callback(
        
'|<p>\s*\w|',
        
create_function(
            
// Использование одиночных кавычек в данном случае принципиально,
            // альтернатива - экранировать все символы '$'
            
'$matches',
            
'return strtolower($matches[0]);'
        
),
        
$line
    
);
    echo 
$line;
}
fclose($fp);
?>

subject

Строка или массив строк для поиска и замены.

limit

Максимально возможное количество замен для каждого шаблона в каждой строке subject. По умолчанию равно -1 (без ограничений).

count

Если указана, то эта переменная будет заполнена количеством произведенных замен.

Возвращаемые значения

preg_replace_callback() возвращает массив, если параметр subject является массивом, иначе возвращается строка. В случае ошибок возвращается NULL

Если найдены совпадения, будет возвращена результирующая строка, иначе subject вернется неизмененным.

Список изменений

Версия Описание
5.1.0 Добавлен параметр count

Примеры

Пример #2 Пример использования preg_replace_callback()

<?php
// Этот текст был использован в 2002 году
// мы хотим обновить даты к 2003 году
$text "День дураков: 01/04/2002\n";
$text.= "Последнее Рождество было: 24/12/2001\n";
// callback-функция
function next_year($matches)
{
  
// как обычно: $matches[0] -  полное вхождение шаблона
  // $matches[1] - вхождение первой подмаски,
  // заключенной в круглые скобки, и так далее...
  
return $matches[1].($matches[2]+1);
}
echo 
preg_replace_callback(
            
"|(\d{2}/\d{2}/)(\d{4})|",
            
"next_year",
            
$text);

?>

Результат выполнения данного примера:

День дураков: 01/04/2003
Последнее Рождество было: 24/12/2002

Пример #3 Рекурсивная обработка BB-кодов с помощью preg_replace_callback()

<?php
$input 
"верх [indent] глубже [indent] еще глубже [/indent] глубже [/indent] верх";

function 
parseTagsRecursive($input)
{

    
$regex '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

    if (
is_array($input)) {
        
$input '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return 
preg_replace_callback($regex'parseTagsRecursive'$input);
}

$output parseTagsRecursive($input);

echo 
$output;
?>

Смотрите также


PCRE
PHP Manual