更好的方法是搜索和替换模板

时间:2013-04-25 11:55:25

标签: php replace

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

$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个,就像上面那样。

是否有更好/更清洁/专业的方法(搜索和替换,或以不同的方式完成整个事情)。我发现这非常混乱和不专业。

6 个答案:

答案 0 :(得分:3)

是的,你可以定义要替换的数组和另一个要替换的数组。

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

$template = str_replace($array1 , $array2 , $template);

答案 1 :(得分:2)

修改ljubiccica's answer。您可以使用变量和值创建关联数组,然后替换它们:

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

答案 2 :(得分: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";

但是我建议反对,因为它可能会暴露你不想暴露的变量。

答案 3 :(得分:1)

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

答案 4 :(得分: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}]标签中的内容吗?

答案 5 :(得分: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)