preg_replace с модификатором /e экранирует символы

killer112

Новичок
Есть шаблон 1.tmpl:
HTML:
<html>
 <head>
  <title>{vars['title']}</title>
 </head>
 <body>
  {vars['content']}
 </body>
</html>
Есть массив $vars и обработчик шаблона:
PHP:
<?
$vars['title']='Заголовок';
$vars['content']='Контент';

$template = file_get_contents("1.tmpl");
$text= preg_replace('/\{(.*?)\}/e', "$1", $template);
echo $text;
?>
Вылезает ошибка: Failed evaluating code: $vars[\'title\'] - то есть происходит экранирование одиночных кавычек, из-за чего код не работает.

В документации эта фишка прописана. Но спрашивается, нафига выполнять код, если в код добавляются ненужные слеши, которые выполнению мешают?

В общем, подскажите плиз, как избавиться от этого ненужного экранирования? Заранее благодарю!
 

killer112

Новичок
К сожалению, preg_replace_callback() мне не очень подходит. Если, к примеру, использовать не вывод ячеек массива, а вызывать функцию с параметрами. Например, {my_function('some value')}.

Может быть, другой вариант есть?
 

AmdY

Пью пиво
Команда форума
killer112
там же можно юзать анонимную функцию или create_function, так что с параметрами проблем особых не должно возникнуть.
 

killer112

Новичок
Не спорю. Можно и так, но как-то некрасиво получается. ИМХО есть более грамотное решение :)
 

Gas

может по одной?
попробуй не "$1", а '$1'
ну и точно в переменной $template неэкранированные данные?
 

ArkDoom

Новичок
killer112
Ты сказал самому AmdY - неграмотное решение, чел...за тобой уже едут)))))

P.S. А чем тебе не нравяться анонимные фунции? Поставь пару пробелов - будет красиво (ПРОБЕЛЬ СВОЕ ЭГО)
 

killer112

Новичок
killer112
Ты сказал самому AmdY - неграмотное решение, чел...за тобой уже едут)))))

P.S. А чем тебе не нравяться анонимные фунции? Поставь пару пробелов - будет красиво (ПРОБЕЛЬ СВОЕ ЭГО)
Не то чтобы неграмотное. Но в то же время не могу сказать, что 100% верное. В то же время мне кажется, что красивое решение где-то рядом :)
 

AmdY

Пью пиво
Команда форума
красивое решение с замыканием, всё остальное eval, который не может быть красивым никак.
я ничего пробовал сам и гуглил, но для решения с e не нашёл.


ArkDoom
жвачка уже закончилась :(
 

tz-lom

Продвинутый новичок
я так понимаю когда вы решаете проблему регуляркой - у вас уже 2 проблемы,а когда у неё ещё и флаг e - проблем уже 3
 
  • Like
Реакции: AmdY

tz-lom

Продвинутый новичок
делать шаблоны php файлами и подключать их
PHP:
<html>
 <head>
  <title><?=$vars['title']?></title>
 </head>
 <body>
  <?=$vars['content']?>
 </body>
</html>
 

fixxxer

К.О.
Партнер клуба
Include (то есть байткод подключаемого файла) кэшируется акселераторами, eval - нет.
 

fixxxer

К.О.
Партнер клуба
А если шаблон хранится в БД то надо оторвать руки тому, кто это придумал.
 

Gas

может по одной?
ну конечно, особенно редактировать эти шаблоны очень удобно.
 
Сверху