FROM preg_replace TO preg_replace_callback

Привет, коллеги!

У меня возникли проблемы с обновлением старой функции до preg_replace_callback. Изменить: что я делаю неправильно?

Это моя первая (preg_replace / устаревшая) функция:

if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); @eval('$templ = new '.TEMPL_CLASS.';'); $buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer); $out .= $buffer; } fclose($handle); } 

Вторая функция (это моя попытка конвертировать в preg_replace_callback):

 if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); @eval('$templ = new '.TEMPL_CLASS.';'); $buffer = preg_replace_callback( '#§([\w-]+)\.?([\w-]+)?#', function ($m) { @$templ->$m[1]($m[2]); }, $buffer ); $out .= $buffer; } fclose($handle); } 

OLD! Ответ M42 фиксировал следующую ошибку:

Предупреждение: preg_replace_callback (): Модификатор / e нельзя использовать с обратным вызовом замены в /var/www/inc/engine.php в строке 52

 ); <-- line 52 $out .= $buffer; 

Изменить: я не знаю, как обрабатывать часть рендеринга этого.

 $buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer); 

Сейчас он показывает пустую страницу. Я предполагаю, что ошибка в

return templ ($ m [1], $ m [2]);

Как сказано в сообщении, удаляется модификатор e :

 '#§\\(\\[a-z0-9-_\\]+\\)\.?\\(\\[a-z0-9-_\\]+\\)?#i' // here ___^ 

И не нужно избегать всех этих персонажей:

 '#§([a-z0-9_-]+)\.?([a-z0-9_-]+)?#i' 

[a-z0-9_] можно переписать \w и нет необходимости в модификаторе

 '#§([\w-]+)\.?([\w-]+)?#' 

Вся инструкция становится:

 $buffer = preg_replace_callback( '#§([\w-]+)\.?([\w-]+)?#', function ($m) { return templ($m[1], $m[2]); }, $buffer );