Замена {{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;
?>