1

Topic: PHP preg_replace_callback() и create_function()

Поведение этой функции во многом напоминает 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);
?>

2

Re: PHP preg_replace_callback() и create_function()

Пример #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;
?>

Источник тут