0

我有这个模板文件作为 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);

?>
4

2 回答 2

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);
于 2012-07-14T13:15:03.040 回答
0

str_replace 是正确的功能。但是$replace数组必须将值保存在相同的平面结构中,例如$search

所以:

$replace = array('Hello World', '<li>Step 1</li><li>Step 2</li>', // an so on    ); 
于 2012-07-14T13:13:24.093 回答