(PHP 4 >= 4.0.5, PHP 5, PHP 7)
preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием callback-функции
$pattern
   , callable $callback
   , mixed $subject
   [, int $limit = -1
   [, int &$count
  ]] )
   Поведение этой функции во многом напоминает
   preg_replace(), за исключением того, что вместо
   параметра replacement необходимо указывать
   callback-функцию.
  
patternИскомый шаблон. Может быть как строкой, так и массивом строк.
callback
       Вызываемая callback-функция, которой будет передан массив
       совпавших элементов из строки subject.
       Callback-функция должна вернуть строку с заменой. Callback-функция должна быть описана так:
      
$matches
        )
       Достаточно часто callback функция,
       кроме как в вызове preg_replace_callback(),
       ни в чем больше не участвует. Исходя из этих соображений, можно
       использовать анонимные функции для
       создания callback-функции непосредственно
       в вызове preg_replace_callback().
       Если вы используете такой подход, вся информация, связанная с
       заменой по регулярному выражению, будет собрана в одном
       месте, и пространство имен функций не будет загромождаться
       неиспользуемыми записями.
      
Пример #1 preg_replace_callback() и анонимная функция
<?php
/* фильтр, подобный тому, что используется в системах Unix
 * для преобразования заглавных букв в начале параграфа в строчные */
$fp = fopen("php://stdin", "r") or die("не удалось прочесть stdin");
while (!feof($fp)) {
    $line = fgets($fp);
    $line = preg_replace_callback(
        '|<p>\s*\w|',
        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;
?>