带有占位符的php str_replace模板

时间:2012-10-19 11:44:37

标签: php templates str-replace

我有一个数据数组

    $data = array(title=>'some title', date=>1350498600, story=>'Some story');

我有一个模板

    $template = "#title#, <br>#date(d)#<br> #date(m)#<br>#date(Y)#<br> #story#"; 

我想要的只是将数据放入模板中,我知道可以通过str_replace完成,但我的问题是日期格式。日期格式来自模板而不是来自数据,在数据日期中存储为php日期。 昨天我试着提出同样的问题,但我认为我的问题不明确。 有人请帮助我。

3 个答案:

答案 0 :(得分:1)

我认为它无法轻松使用str_replace所以我将使用preg_replace

$data = array('title'=>'some title', 'date'=>1350498600, 'story'=>'Some story');
$template = "#title#, <br>#date(d)#<br> #date(m)#<br>#date(Y)#<br> #story#"; 
$result = preg_replace_callback('/#(\w+)(?:\\((.*?)\\))?#/', function ($match) use($data) {
    $value = isset($data[$match[1]]) ? $data[$match[1]] : null;

    if (!$value) {
        // undefined variable in template throw exception or something ...
    }

    if (! empty($match[2]) && $match[1] == "date") {
        $value = date($match[2], $value);
    }

    return $value;
}, $template);

您可以使用此代码段执行date(m)之类的操作,而不是使用date(Y) date(d-m-Y)

这样做的缺点是您可以使用此机制仅格式化date变量。但是通过一些调整,您可以扩展此功能。


注意:如果您使用的是低于5.3的PHP版本,则无法使用闭包,但您可以执行以下操作:

function replace_callback_variables($match) {
    global $data; // this is ugly

    // same code as above:

    $value = isset($data[$match[1]]) ? $data[$match[1]] : null;

    if (!$value) {
        // undefined variable in template throw exception or something ...
    }

    if (! empty($match[2]) && $match[1] == "date") {
        $value = date($match[2], $value);
    }
    return $value;
}

$data = array('title'=>'some title', 'date'=>1350498600, 'story'=>'Some story');
$template = "#title#, <br>#date(d)#<br> #date(m)#<br>#date(Y)#<br> #story#";
// pass the function name as string to preg_replace_callback
$result = preg_replace_callback('/#(\w+)(?:\\((.*?)\\))?#/', 'replace_callback_variables', $template);

您可以在PHP here

中找到有关回调的更多信息

答案 1 :(得分:0)

答案 2 :(得分:0)

下载此文件:http://www.imleeds.com/template.class.txt

将扩展名重命名为.PHP,来自.TXT

这是我多年前创建的,我总是将我的HTML与PHP保持一致。所以请看下面的例子。

<?php

include("template.class.php");

//Initialise the template class.
$tmpl = new template;

$name = "Richard";
$person = array("Name" => "Richard", "Domain" => "imleeds.com");

/*
On index.html, you can now use: %var.name|Default if not found% and also, extend further, %var.person.Name|Default%
*/

//Output the HTML.
echo $tmpl->run(file_get_contents("html/index.html"));

?>