我如何在PHP中替换一些匹配的模板标签

时间:2012-07-14 12:51:36

标签: php templates replace

我将此模板文件作为HTML并愿意用正确的内容替换所有匹配的标签,例如[**title**]等,然后将其作为PHP文件写入磁盘。我已经完成了一系列搜索,似乎没有一个符合我的目的。以下是HTML代码。问题是它并不总是取代正确的标签?

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>[**title**]</title>
  </head>
  <body>
  <!--.wrap-->
  <div id="wrap">
  <!--.banner-->
  <div class="banner">[**banner**]</div>
  <!--/.banner-->

  <div class="list">
    <ul>[**list**]</ul>
  </div>

  <!--.content-->
  <div class="content">[**content**]</div>
  <!--/.content-->

  <!--.footer-->
  <div class="footer">[**footer**]</div>
  <!--/.footer-->

  </div>
  <!--/.wrap-->

</body>
</html>

这是我到目前为止所尝试过的。

<?php
    $search = array('[**title**]', '[**banner**]', '[**list**]'); // and so on...
    $replace = array(
        'title' => 'Hello World', 
        'list' => '<li>Step 1</li><li>Step 2</li>', // an so on
    ); 

    $template = 'template.html';
    $raw = file_get_contents($template);
    $output = str_replace($search, $replace, $raw);
    $file = 'template.php';
    $file = file_put_contents($file, $output);

?>

2 个答案:

答案 0 :(得分:1)

代码中的问题是您在$replace数组中使用了密钥。 str_replace只是根据数组中的位置进行替换,因此键不执行任何操作。

因此,您[**banner**]中的$search作为第二项,因此它将替换为替换中的第二项,即<li>Step 1</li><li>Step 2</li>.

如果您想通过密钥自动执行此操作(因此[**foo**]总是替换为$replace['foo'],您可能需要查看使用正则表达式。我敲了一段快速的代码当我测试它,但可能有错误:

<?php
function replace_callback($matches) {
        $replace = array(
            'title' => 'Hello World', 
            'list' => '<li>Step 1</li><li>Step 2</li>', // an so on
        );

    if ( array_key_exists($matches[1], $replace)) {
        return $replace[$matches[1]];
    } else {
        return '';
    }
}

$template = 'template.html';
$raw = file_get_contents($template);

$output = preg_replace_callback("/\[\*\*([a-z]+)\*\*\]/", 'replace_callback', $raw);

$file = 'template.php';
$file = file_put_contents($file, $output);

答案 1 :(得分:0)

str_replace是正确的功能。 但是$replace数组必须将值保存在与$search

相同的平面结构中

所以:

$replace = array('Hello World', '<li>Step 1</li><li>Step 2</li>', // an so on    );