2014-10-15 3 views
0

Я пытаюсь создать систему, где я могу создать файл, основанный на шаблоне. Шаблон хранится в БД, и я заполняю шаблон данными, отправленными из формы.Строка шаблона заменить в php

Я пробовал делать это таким образом, но я не могу использовать массив. Это всегда дает мне ошибку.

<?php 

$string = "test"; 
$text = "This is a text for testing"; 

$rplc_string = '{$string}'; 
$rplc_text = '{$text}'; 

$tpl = '<html><head><title>{$string}</title></head><body><h1>{$string}</h1><p>{$text}</p><ul><?php foreach($array as $key => $value): ?><li><?php echo $key; ?></li><?php endforeach; ?></ul></body></html>'; 

$tpl = preg_replace($rplc_string, $string, $tpl); 
$tpl = preg_replace($rplc_text, $text, $tpl); 

$array = array('one' => '1', 'two' => '2', 'three' => '3'); 

ob_start(); 
eval('?>' . $tpl); 
$output = ob_get_clean(); 

echo $output; 

?> 

Есть ли лучший способ сделать это?

+0

Чем больше вопрос, зачем изобретать велосипед? Существует множество надежных систем шаблонов, которые, вероятно, будут служить вам лучше, чем то, что вы взломали. Они также предоставили бы хорошую возможность узнать, как могут быть разработаны такие системы шаблонов. Использование 'eval()' для стартеров - ДЕЙСТВИТЕЛЬНО плохая идея. –

+0

@MikeBrant Это не шаблонная система. То, что я пытаюсь сделать, это то же самое, что и при использовании шаблона электронной почты, который будет заполняться данными от пользователя, так же, как вы заменили бы $ to_user по имени пользователя и $ to_email по электронной почте пользователя. – user3718566

+0

есть несколько шаблонов электронной почты для шаблонов, которые не зависят от eval. вы в основном просите кого-то захватить вашу систему. –

ответ

0

Заменить из двойных кавычек в одинарные кавычки, когда вы определяете $ TPL

также первый аргумент из preg_replace должен быть регулярным выражением:

<?php 

$string = 'test'; 
$text = 'This is a text for testing'; 

$rplc_string = '/{\$string}/'; 
$rplc_text = '/{\$text}/'; 


$tpl = '<html><head><title>{$string}</title></head><body><h1>{$string}</h1><p>{$text}</p><ul><?php foreach($array as $key => $value): ?><li><?php echo $key; ?></li><?php endforeach; ?></ul></body></html>'; 

$array = array('one' => '1', 'two' => '2', 'three' => '3'); 

$tpl = preg_replace($rplc_string, $string, $tpl); 
$tpl = preg_replace($rplc_text, $text, $tpl); 

ob_start(); 
eval('?>' . $tpl); 
$output = ob_get_clean(); 

echo $output; 

?> 
+0

Он работает для массива, но убивает preg_replace – user3718566

+0

Я отредактировал это, чтобы исправить проблему с preg_replace – blots

0

В коде есть несколько ошибок. Во-первых, вы считаете, что переменная будет интерпретироваться между одинарными кавычками. Это ложь. Переменная интерпретируется только между двойными кавычками или использованием синтаксиса heredoc.

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

+0

Это работает. Единственная проблема - это массив. Моя цель - передать массив на eval, но я не могу этого сделать. Это всего лишь тестовый код, чтобы получить то, что мне нужно, и реализовать его в реальном коде. – user3718566

+0

@ user3718566: Почему вы просите о помощи, если знаете, в чем проблема? Чтобы быть понятным, ваш код плохо сформирован и не имеет смысла. Вам нужно переосмыслить свой подход с самого начала. –

+0

Потому что я думаю, что есть лучший способ сделать это, просто я не добираюсь туда, и поэтому я прошу помощи, немного света в конце туннеля. – user3718566

Смежные вопросы