5

我目前正在搜索和替换这样的网页模板:

$template = <<<TEMP
<html>
<head>
<title>[{pageTitle}]</title>
</head>
[{menuA}]
[{menuB}]
[{bodyContent}]
</html>
<<<TEMP;

以上内容放在单独的文件中。

然后,我这样做:

$template = str_replace("[{pageTitle}]",$pageTitle,$template);
$template = str_replace("[{menuA}]",$menuA,$template);
$template = str_replace("[{menuB}]",$menuB,$template);
$template = str_replace("[{bodyContent}]",$bodyContent,$template);
//Some 10 more similar to the above go here.
echo $template;

问题是,总共有大约 15 个,就像上面的一样。

有没有更好/更清洁/专业的方法来做到这一点(搜索和替换,或者以不同的方式做整个事情)。我觉得这非常混乱和不专业。

4

6 回答 6

3

是的,您可以定义要替换的事物的数组以及要替换的事物的另一个数组。

$array1 = array("[{pageTitle}]", "[{menuA}]");
$array2 = array($pageTitle, $menuA);

$template = str_replace($array1 , $array2 , $template);
于 2013-04-25T11:58:40.703 回答
2

通过修改ljubiccica 的答案。您可以使用变量和值创建关联数组,然后替换它们:

$array=array(
        'pageTitle'=>$pageTitle,
        'menuA'=> $menuA,
        );

$addBrackets = function($a)
{
    return '[{'.$a.'}]';
};
$array1 = array_keys($array);
$array1 = array_map($addBrackets,$array1);

$array2 = array_values($array);

$template = str_replace($array1 , $array2 , $template);
于 2013-04-25T12:36:16.243 回答
1

最好的方法是使用现有的库,如SmartyTwig

如果您想推出自己的模板解决方案,您可以使用正则表达式:

// Just an example array
$values = array('pageTitle' => 'foo', 'menuA' => 'bar');
$offset = 0;
while(preg_match('/\[\{([a-zA-Z]+)\]\}/', $template, $matches, 
  PREG_OFFSET_CAPTURE, $offset)) {
    $varname = $matches[0][3];
    $value = isset($values[$varname]) ? $values[$varname] : "Not found!";
    $template = str_replace('[{'.$varname.'}]', $value, $template);
    $offset = $matches[1];
}

如果你不喜欢关联数组,你可以这样做:

$value = isset($$varname)? $$varname : "Not found";

但我建议不要这样做,因为它可能会暴露你不想暴露的变量。

于 2013-04-25T12:08:21.367 回答
1

不要重新发明轮子,使用现有的模板引擎。我建议使用twig,因为它既简单又快速!

于 2013-04-25T12:12:09.467 回答
0

使用正则表达式怎么样。如下所示:

   $matches = array();
    preg_match_all("/\[\{.*?\}\]/", $template, $matches);
    foreach ($matches[0] as $match){
    // this will replace the '[{','}]' braces as we don't want these in our file name
    $var = str_replace("[{", "", $match);
    $var = str_replace("}]", "", $var);
    // this should pull in the file name and continue the output
    $template = str_replace($match, $$var, $template);
    }

我还没有测试过,但这样你就不必知道你需要更换什么?例如,它会用 $text 替换 [{text}] 标签中的内容吗?

于 2013-04-25T12:07:48.177 回答
0

我发现这样的事情确实有效:

    $foo = 'bar';
    $baz = 'foo';

    $test = 'Test [{foo}] and [{baz}]';

    $test1 = preg_replace("/\[{(.*?)}\]/e", "$$1", $test);
    $test2 = preg_replace_callback("/\[{(.*?)}\]/", function($v) use($foo, $baz)
            {
                return ${$v[1]};
            }, $test);
    var_dump($test1); //string 'Test bar and foo' (length=16)
    var_dump($test2); //string 'Test bar and foo' (length=16)

所以在你的情况下:

$template= preg_replace("/\[{(.*?)}\]/e", "$$1", $template);

编辑:

您还可以检查变量是否设置如下:

    $foo = 'bar';
    $baz = 'foo';

    $test = 'Test [{foo}] and [{baz}] or [{ble}]';

    $test1 = preg_replace("/\[{(.*?)}\]/e", "isset($$1) ? $$1 : '$$1';", $test);
    var_dump($test1); //string 'Test bar and foo or $ble' (length=24)
于 2013-04-25T12:34:56.917 回答