Заменить устаревшее preg_replace/e с preg_replace_callback

$result = preg_replace(
    "/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/iseU", 
    "CallFunction('\\1','\\2','\\3','\\4','\\5')",
    $result
);

Приведенный выше код дает предупреждение об отказе после обновления до PHP 5.5:

Устаревший: preg_replace(): Модификатор /e устарел, вместо этого используйте preg_replace_callback

Как заменить код на preg_replace_callback()?

Ответ 1

Вы можете использовать анонимную функцию, чтобы передать соответствия вашей функции:

$result = preg_replace_callback(
    "/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/isU",
    function($m) { return CallFunction($m[1], $m[2], $m[3], $m[4], $m[5]); },
    $result
);

Кроме того, что это быстрее, это также правильно обрабатывает двойные кавычки в вашей строке. Ваш текущий код с помощью /e преобразует двойную кавычку " в \".