替换 php 文件中的 {{字符串}}

2022-08-30 23:53:01

我在我的一个类方法中包含一个文件,并且该文件具有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

<?= htmlspecialchars($newsletter, ENT_QUOTES); ?>

要替换变量,请执行以下操作:

$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)。

使用此选项可提高可读性:https://www.php.net/manual/en/control-structures.alternative-syntax.php


答案 2

这是我用于模板的代码,应该做这个技巧

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

推荐