Привет, коллеги!
У меня возникли проблемы с обновлением старой функции до 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 );