【问题标题】:PHP regex templating - find all occurrences of {{var}}PHP 正则表达式模板 - 查找所有出现的 {{var}}
【发布时间】:2023-03-06 17:49:01
【问题描述】:

我需要一些帮助来为我的 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 文档?

如果是真的,有人可以帮我看一个可以为我解析的正则表达式(如果你也解释一下它是如何工作的,我将不胜感激,因为我还不太擅长正则表达式)。

非常感谢。

【问题讨论】:

    标签: php regex templates


    【解决方案1】:

    使用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)。

    【讨论】:

    • 谢谢,这似乎正是我所追求的。
    • 我会在实际术语周围允许零个或多个空格,从而使正则表达式模式'!\{\{\s?(\w+)\s?\}\}!' 因此不仅允许{{term}},还允许{{ term}}{{term }}{{ term }}
    【解决方案2】:

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

    【讨论】:

    • 虽然如果您实际上是在 HTML 标记或属性上进行文本搜索,这是一个合理的立场,但此模板语法非常具体(双花括号),您没有正常的 HTML 正则表达式问题,因为除了你想要的地方,这个字符序列几乎不会出现。 HTML 正则表达式解析很不稳定,但情况并非如此。
    【解决方案3】:

    不必使用全局变量并优雅地处理您可以使用的缺失键

    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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2021-08-20
      • 1970-01-01
      • 2020-04-12
      • 2013-10-27
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多