【问题标题】:Find all template tags in a PHP string?查找 PHP 字符串中的所有模板标签?
【发布时间】:2016-02-16 23:44:11
【问题描述】:

我的应用中有一个活动事件日志,记录了用户在应用中执行的每个操作。

动作记录有一个event_type 来说明它是什么类型的事件。

还有一个页面可以查看此活动日志/流。

我的应用还允许用户创建和使用自定义插件,他们可以在插件中定义自己的event_type,然后使用event_type 从那里的插件代码创建活动事件。

activity_type 存储在它自己的数据库表中,并且有一个列 template 将用于存储每次在活动日志/流页面上显示此 event_type 时将显示的文本。

例如

Jason Davis 为 StackOverflow 网站创建了一个书签: http://www.stackoverflow.com

对于上面的输出,我们需要将这些项目的值存储在实际的活动事件记录中:

用户名将在表格列中,但其他数据可能是每个 event_type 的不同类型。

出于这个原因,在activity_events DB 表上,我有一个名为 `entity_meta_json' 的列

entity_meta_json' will allow anactivity_event` 记录用于存储事件的任何额外数据的键/值。

然后回到活动日志/流页面,我们将在其中构建漂亮的事件 HTML 视图。我可以从事件event_type 中获取template 列,并将模板标签替换为“entity_meta_json”列中的任何匹配键/值。

最终结果是每个事件类型都可以在事件日志/流页面上拥有自己的 HTML 视图,插件开发人员可以轻松添加新的 event_types 并为那里的 event_types 构建模板,并在自己的插件中注册事件并传递在该模板所需的任何额外数据中!

一些代码...

此代码从数据库中获取 JSON 字符串并将其转换为数组,然后将模板字符串替换为带有数组键/值的模板标签....

// simulate getting JSON data back from the Database
$dbJsonString = '{"submitdate":"2-16-2016","metakey2":"metavalue2","metakey3":"metavalue3"}';

// convert database JSON string back into an Array
$jsonArray = json_decode($dbJsonString, true);

// template string text with template tags to be replaced by matching data in $jsonArray
$templateString = '<strong>Date Submitted:</strong> {{submitdate}} {{tag_that_has_no_key}}';

foreach ($jsonArray as $key => $value) {
    if (isset($value) && $value != '') {
        $templateString = str_replace('{{'.$key.'}}', $value, $templateString);
    } else {
        $templateString = str_replace('{{'.$key.'}}', '------', $templateString);
    }
}

echo $templateString;

输出

Date Submitted: 2-16-2016 {{quotenumber}}

问题...

现在在演示中它工作得很好,除了如果模板有模板标签,而数组没有匹配的键,那么模板标签只是以标签格式显示在最终结果中。

我想用空格替换没有匹配键的模板标签。

因为它现在的工作方式,它遍历数组中的每个键以查找替换,因此那些丢失的键永远不会看到数组中没有键的模板标签。

模板将始终与数据库中的那些标签保持相同。插件开发者虽然会调用一个函数来添加新的事件记录,但那里的数据可能会丢失一些模板标签键。

一个想法,

如果我还可以解析模板字符串并获取字符串中的所有模板标签,然后我可以将其与用户传入的数据值数组以及该数组中缺少的任何键进行比较,我可以将该键添加到那里数组并将值设置为空,这将使模板标签在其他标签时被检测和替换。

问题...

所以我的问题是如何检测字符串中{{tag_name_here}} 格式的所有模板标签并将每个标签放入数组中?

【问题讨论】:

    标签: php regex templates


    【解决方案1】:

    类似这样的:

    $result = preg_replace_callback('~{{([^}]*)}}~', function ($m) use ($jsonArray) {
        return isset($jsonArray[$m[1]]) ? $jsonArray[$m[1]] : '';
    }, $templateString);
    

    优点是:

    • 无需循环到$jsonArray,因为可能的键是用isset 对字符串中的每个{{...}} 进行测试的。
    • 字符串只解析一次。

    【讨论】:

      猜你喜欢
      • 2023-01-31
      • 2011-01-29
      • 2013-03-22
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多