0

我有一个数据数组

    $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 日期。昨天我试图问同样的问题,但我认为我的问题并不清楚。任何人请帮助我。

4

3 回答 3

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)ordate(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 回调的更多信息

于 2012-10-19T11:54:52.400 回答
0

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

将扩展名从 .TXT 重命名为 .PHP

这是我多年前创建的东西,我总是让我的 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"));

?>
于 2012-10-19T12:07:24.583 回答