Замена {{string}} внутри php файла
Я включаю файл в один из моих методов класса, и в этом файле есть html + php-код. Я возвращаю строку в этом коде. Я явно написал {{newsletter}}
, а затем в моем методе я сделал следующее:
$contactStr = include 'templates/contact.php';
$contactStr = str_replace("{{newsletter}}",$newsletterStr,$contactStr);
Однако он не заменяет строку. Единственная причина, по которой я это делаю, - это то, что когда я пытаюсь передать переменную во включенный файл, она, похоже, не распознает ее.
$newsletterStr = 'some value';
$contactStr = include 'templates/contact.php';
Итак, как мне реализовать метод замены строк?
Ответы
Ответ 1
Вы можете использовать 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) в своем шаблоне.
Ответ 2
Это код, который я использую для шаблонов, должен сделать свое дело
if (preg_match_all("/{{(.*?)}}/", $template, $m)) {
foreach ($m[1] as $i => $varname) {
$template = str_replace($m[0][$i], sprintf('%s', $varname), $template);
}
}
Ответ 3
может быть, немного поздно, но я смотрел что-то вроде этого.
Проблема заключается в том, что include не возвращает содержимое файла, и проще было бы использовать функцию file_get_contents.
$template = file_get_contents('test.html', FILE_USE_INCLUDE_PATH);
$page = str_replace("{{nombre}}","Alvaro",$template);
echo $page;
Ответ 4
Используйте 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...'));
Ответ 5
нет, не включайте для этого. 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));
Ответ 6
на основе @da-hype
<?php
$template = "hello {{name}} world! {{abc}}\n";
$data = ['name' => 'php', 'abc' => 'asodhausdhasudh'];
if (preg_match_all("/{{(.*?)}}/", $template, $m)) {
foreach ($m[1] as $i => $varname) {
$template = str_replace($m[0][$i], sprintf('%s', $data[$varname]), $template);
}
}
echo $template;
?>