在 PHP 字符串中查找所有模板标签


Find all template tags in a PHP string?

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

操作记录具有指示事件类型event_type

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

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

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

例如

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

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

  • 杰森·戴维斯
  • 堆栈溢出
  • http://www.stackoverflow.com

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

出于这个原因,在activity_events数据库表上,我有一个名为"entity_meta_json"的列

entity_meta_json' will allow an activity_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}} 格式检测所有模板 t ags 并将每个模板放入数组中?

像这样:

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

优点是:

  • 不需要循环到$jsonArray,因为可能的键是用字符串中每个{{...}}isset测试的。
  • 该字符串仅解析一次。