超级基础模板系统

时间:2009-01-12 02:46:33

标签: php templates

我希望能够使用以下方案用正则表达式替换文件中的内容:

我有一个数组:

$data = array(
  'title' => 'My Cool Title',
  'content' => ''
)

我也有一个模板(为清楚起见,我们假设下面的内容被分配给变量 $ template

<html>
<title><% title %></title>
<body><% content %></body>
</html>

我希望能够使用一个正则表达式完成整个事情,因此它可以尽可能通用;以下是我的尝试(不起作用)

$endMarkup = preg_replace('/<% ([a-z]+) %>/',$data["\\1"], $template);

是否有一个干净的解决方案,用于通过数组索引将关联数组数据放入模板中?

4 个答案:

答案 0 :(得分:4)

通过一点点工作,你可以通过一次preg_replace电话来完成:

$replacements = array();
foreach ($data as $search => $replacement) {
   $replacements["/<% $search %>/"] = $replacement;
}
$endMarkup = preg_replace(
     array_keys($replacements), 
     array_values($replacements), 
     $template);

答案 1 :(得分:2)

如果你愿意,你可以尝试没有正则表达式。函数str_replace就是为此而创建的。如果您不了解正则表达式,这将是您的最佳选择。

测试数据:

$data = array(
  'title' => 'My Cool Title',
  'content' => ''
);

$file = <<< EOF
<html>
<title><% title %></title>
<body><% content %></body>
</html>
EOF;

功能和示例:

function replace_template($template, $data)
{
    $replace = array_fill(0, count($data), '<%% %s %%>');
    $keys = array_map('sprintf', $replace, array_keys($data));
    $output = str_replace($keys, $data, $template);
    return $output;
}

echo replace_template($file, $data);

答案 2 :(得分:1)

你为什么要费心去模板? PHP已经是一种模板语言。除非您试图排除代码执行的可能性,否则您需要的所有内容都将构建在语言中。

您可以使用带有短标签的普通PHP编写模板。您可以将它全部包含在函数中以限制变量范围。您可以使用import()从数组中获取一些变量。您可以使用includerequire()来处理加载,解析和解析将值插入文件。您可以使用输出缓冲(ob_start() / ob_end())来处理捕获字符串中的输出。一切都是内置的,快速的和彻底测试过。

答案 3 :(得分:0)

您可以使用preg_replace_callback()执行此操作。我就是这样做的:

function get_data($matches) {
    global $data;

    return $data[$matches[1]];
}

$endMarkup = preg_replace_callback('/<% ([a-z]+) %>/', 'get_data', $template);

如果您愿意,可以使用create_function()一行中的所有内容:

$endMarkup = preg_replace_callback('/<% ([a-z]+) %>/', create_function('$matches', 'global $data; return $data[$matches[1]];'), $template);