PHP正则表达式模板 - 查找所有出现的{{var}}

时间:2009-06-06 04:45:45

标签: php regex templates

我需要一些帮助来为我的php脚本创建一个正则表达式。基本上,我有一个包含我的数据的关联数组,我想使用preg_replace用真实数据替换一些占位符。输入将是这样的:

<td>{{address}}</td><td>{{fixDate}}</td><td>{{measureDate}}</td><td>{{builder}}</td>

我不想使用str_replace,因为数组可能包含的项目比我需要的多得多。

如果我理解正确,preg_replace能够从正则表达式中获取它找到的文本,并将其替换为数组中该键的值,例如

<td>{{address}}</td>

替换为 $ replace ['address'] 的值。这是真的,还是我误读了php文档?

如果确实如此,有人可以帮我看一个正在解析这个问题的正则表达式(如果你也解释它是如何工作的话会很感激,因为我对正则表达式还不是很好)。

非常感谢。

3 个答案:

答案 0 :(得分:8)

使用preg_replace_callback()。它对这类事物非常有用。

$replace_values = array(
  'test' => 'test two',
);
$result = preg_replace_callback('!\{\{(\w+)\}\}!', 'replace_value', $input);

function replace_value($matches) {
  global $replace_values;
  return $replace_values[$matches[1]];
}

基本上这表示查找包含单词字符的{{...}}的所有匹配项,并将该值替换为查找表中的值(作为全局$ replace_values)。

答案 1 :(得分:0)

对于结构良好的HTML / XML解析,请考虑将Document Object Model (DOM)XPath结合使用。使用它比正则表达式更有趣。

答案 2 :(得分:0)

不必使用全局变量并优雅地处理丢失的密钥,您可以使用

function render($template, $vars) {
        return \preg_replace_callback("!{{\s*(?P<key>[a-zA-Z0-9_-]+?)\s*}}!", function($match) use($vars){
            return isset($vars[$match["key"]]) ? $vars[$match["key"]] : $match[0];
        }, $template);
    }