Замена {{string}} внутри php-файла

Я включаю файл в один из моих методов класса, и в этом файле есть html + php-код. Я возвращаю строку в этом коде. Я явно написал {{newsletter}} а затем в своем методе я сделал следующее:

 $contactStr = include 'templates/contact.php'; $contactStr = str_replace("{{newsletter}}",$newsletterStr,$contactStr); 

Однако он не заменяет строку. Единственная причина, по которой я это делаю, – это то, что когда я пытаюсь передать переменную во включенный файл, она, похоже, не распознает ее.

 $newsletterStr = 'some value'; $contactStr = include 'templates/contact.php'; 

Итак, как мне реализовать метод замены строк?

Вы можете использовать PHP в качестве механизма шаблонов. Нет необходимости в конструкциях {{newsletter}} .

Скажем, вы выведете переменную $newsletter в файл шаблона.

 // templates/contact.php <?php echo $newsletter; ?> 

Чтобы заменить переменные, выполните следующие действия:

 $newsletter = 'Your content to replace'; ob_start(); include('templates/contact.php'); $contactStr = ob_get_clean(); echo $contactStr; // $newsletter should be replaces by `Your content to replace` 

Таким образом, вы можете создать собственный механизм шаблонов.

 class Template { protected $_file; protected $_data = array(); public function __construct($file = null) { $this->_file = $file; } public function set($key, $value) { $this->_data[$key] = $value; return $this; } public function render() { extract($this->_data); ob_start(); include($this->_file); return ob_get_clean(); } } // use it $template = new Template('templates/contact.php'); $template->set('newsletter', 'Your content to replace'); echo $template->render(); 

Самое лучшее в этом: вы можете сразу использовать условные инструкции и циклы (полный PHP).

Это код, который я использую для шаблонов, должен делать трюк

  if (preg_match_all("/{{(.*?)}}/", $template, $m)) { foreach ($m[1] as $i => $varname) { $template = str_replace($m[0][$i], sprintf('%s', $varname), $template); } } 

может быть, немного поздно, но я смотрел что-то вроде этого.

Проблема в том, что include не возвращает содержимое файла, и проще было бы использовать функцию file_get_contents.

 $template = file_get_contents('test.html', FILE_USE_INCLUDE_PATH); $page = str_replace("{{nombre}}","Alvaro",$template); echo $page; 

Используйте output_buffers вместе с PHP-переменными. Он гораздо более безопасный, совместимый и многоразовый.

 function template($file, $vars=array()) { if(file_exists($file)){ // Make variables from the array easily accessible in the view extract($vars); // Start collecting output in a buffer ob_start(); require($file); // Get the contents of the buffer $applied_template = ob_get_contents(); // Flush the buffer ob_end_clean(); return $applied_template; } } $final_newsletter = template('letter.php', array('newsletter'=>'The letter...')); 

нет, не включайте для этого. include выполняет php-код. и это возвращаемое значение – это значение, возвращаемое включенным файлом, или если нет возврата: 1.

То, что вы хотите, это file_get_contents() :

 // Here it is safe to use eval(), but it IS NOT a good practice. $contactStr = file_get_contents('templates/contact.php'); eval(str_replace("{{newsletter}}", $newsletterStr, $contactStr));