【问题标题】:Super Basic Templating System超级基础模板系统
【发布时间】:2009-01-12 02:46:33
【问题描述】:

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

我有一个数组:

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

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

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

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

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

有没有一种干净的解决方案可以通过数组索引将关联数组数据放入模板中?

【问题讨论】:

    标签: php templates


    【解决方案1】:

    只需提前一点工作,您就可以通过一个 preg_replace 调用来完成:

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

    【讨论】:

    • 有了这个方法,你可以只使用 str_replace()。
    • 当然。我可能会选择 $replacements["//i"] = $replacement;然后值得使用正则表达式。
    • 如果您无法验证或担保您应该使用 preg_quote 的标题。 print_r(array("df+g?/4dd4" => 3));
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      您为什么要费心制作模板? PHP 已经是一种模板语言。除非您试图排除代码执行的可能性,否则您需要的一切都内置在语言中。

      您可以使用带有短标签的普通 PHP 编写模板。您可以将其全部包装在一个函数中以稍微限制变量范围。您可以使用import() 从数组中获取少量变量。您可以使用include 或require() 来处理加载、解析和将值插入到文件中。您可以使用输出缓冲 (ob_start()/ob_end()) 来处理捕获字符串中的输出。一切都是内置的,快速且经过全面测试。

      【讨论】:

        【解决方案4】:

        您可以使用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);
        

        【讨论】:

          猜你喜欢
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多