【问题标题】:Including template file in PHP and replacing variables在 PHP 中包含模板文件并替换变量
【发布时间】:2013-12-21 14:29:48
【问题描述】:

我有一个 .tpl 文件,其中包含我的网页的 HTML 代码和一个 .php 文件,我想在其中使用 HTML 代码并替换一些变量。 例如想象这是我的 file.tpl:

<html>
<head>
<title>{page_title}</title>
</head>
<body>
Welcome to {site_name}!
</body>
</html>

我想在我的 php 文件中定义 {page_title}{site_name} 并显示它们。

我们可以做到这一点的一种方法是将页面代码加载到变量中,然后替换 {page_title}{site_name},然后回显它们。

但我不知道这是否是最好的方法,因为我认为如果 .tpl 文件很大,会出现一些问题。

请帮助我找到最好的方法。谢谢:-)

【问题讨论】:

  • 我想说:要么使用普通的 PHP 文件进行模板化,要么使用大量现有的模板解决方案之一,如 Twig、Smarty 或 Mustache。如果您想发明自己的模板,您应该知道自己在做什么,并且有充分的理由创建另一个模板系统。
  • 当我看到人们在php中实现模板解决方案时,我总是感到不安,而php实际上是在html中构建的。您期望使用模板带来什么样的好处?在许多情况下,您可以使用干净的结构化 php/html 代码实现相同的目的。
  • @Layne 有时需要限制 PHP 的可用性。例如,如果允许用户创建模板。您不希望它们运行任何 PHP 代码。

标签: php html templates


【解决方案1】:

一种方法:

$replace = array('{page_title}', '{site_name}');
$with = array('Title', 'My Website');

ob_start();
include('my_template.tpl');
$ob = ob_get_clean();

echo str_replace($replace, $with, $ob);

【讨论】:

  • 这产生与file_get_contents 相同的结果,但容易受到利用,因为PHP 是用include 评估的。 user3105264,如果您不想使用模板系统,恕我直言,您应该使用 file_get_contents。
【解决方案2】:

因为我搜索了这个并找到了这篇文章,所以我将提供我的解决方案:

$replacers = [
    'page_title'=> 'Title',
    'site_name' => 'My Website',
];
echo preg_replace("|{(\w*)}|e", '$replacers["$1"]', $your_template_string);

你必须把你的模板变成一个字符串。 例如与

file_get_contents(), 
ob_start(); 
include('my_template.tpl'); 
$ob = ob_get_clean();

或类似的东西。

希望这会有所帮助!?

【讨论】:

    【解决方案3】:

    正如您提到的,您可以将文件读入字符串并替换标记,或者您可以包含文件,但在这种情况下,而不是使用标记插入 php 片段来回显变量,例如:

    <html>
    <head>
    <title><?php echo $page_title ?></title>
    </head>
    <body>
    Welcome to <?php echo $site_name ?>!
    </body>
    </html>
    

    在这种情况下,您不需要在整个模板上运行 str_replace。它还允许您在模板中轻松插入条件或循环。这是我更喜欢处理事情的方式。

    【讨论】:

    • 它也比str_replace快得多,但它很容易受到攻击,任何PHP代码都可以从模板文件中运行。
    • 在模板文件中使用php会给模板设计者带来麻烦。
    【解决方案4】:

    我使用与上述类似的方法,但我也在寻找更好的方法。

    我用这个:

    $templatefile = 'test.tpl';
    $page = file_get_contents($templatefile);
    
    $page = str_replace('{Page_Title}', $pagetitle, $page);
    $page = str_replace('{Site_Name}', $sitename, $page);
    
    echo $page;
    

    很抱歉提出一个已回答的主题,但我正在寻找更好的方法来做到这一点。

    我目前也在使用 jQuery 来执行此操作,因此我可以拥有动态页面而无需完全重新加载。例如:

    <div id="site_name"></div>
    
    <script type="text/javascript">
    $.ajax({
      type: 'GET',
      url: 'data.php',
      data: {
        info: 'sitename'
      }
      success: function(data){
        $('#site_name').html(data); 
        //the data variable is parsed by whatever is echoed from the php file
      }
    });
    </script>
    

    示例 data.php 文件:

    <?php
      echo "My site";
    ?>
    

    希望这对其他人也有帮助。

    【讨论】:

      【解决方案5】:

      这是一个简单的例子,希望它能起作用

      您的 HTML:

      <?php
      
      $html= '
      <div class="col-md-3">
          <img src="{$img}" alt="">
          <h2>{$title}</h2>
          <p>{$address}</p>
          <h3>{$price}</h3>
          <a href="{$link}">Read More</a>
      </div>
      ';
      
      ?>
      

      您要替换的数组

      <?php 
      
      $content_replace = array(
          '{$img}'    => 'Image Link',
          '{$title}'  => 'Title',
          '{$address}'=> 'Your address',
          '{$price}'  => 'Price Goes here',
          '{$link}'   => 'Link',
          );
      
      $content = strtr($html, $content_replace );
      
      echo $content;
      
      
       ?>
      

      【讨论】:

        猜你喜欢
        • 2016-06-13
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        • 2015-07-08
        相关资源
        最近更新 更多