我希望能够使用以下方案用正则表达式替换文件中的内容:
我有一个数组:
$data = array(
'title' => 'My Cool Title',
'content' => ''
)
我也有一个模板(为清楚起见,我们假设下面的内容被分配给变量 $ template )
<html>
<title><% title %></title>
<body><% content %></body>
</html>
我希望能够使用一个正则表达式完成整个事情,因此它可以尽可能通用;以下是我的尝试(不起作用)
$endMarkup = preg_replace('/<% ([a-z]+) %>/',$data["\\1"], $template);
是否有一个干净的解决方案,用于通过数组索引将关联数组数据放入模板中?
答案 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()
从数组中获取一些变量。您可以使用include
或require()
来处理加载,解析和解析将值插入文件。您可以使用输出缓冲(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);