我认为它不会与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
找到有关回调的详细信息
这会让你的模板引擎变慢。如果我是你,我会拥有一个简单的替代模板引擎。 –
谢谢你的回答。你的建议呢? – alladeen