我的应用中有一个活动事件日志,记录用户在应用中执行的每项操作。
动作记录有一个event_type
来告诉它是什么类型的事件。
还会有一个页面来查看此活动日志/流。
我的应用程序还允许用户创建和使用自定义插件,在插件中他们可以定义自己的event_type
,然后使用插件代码中的event_type
创建活动事件。
activity_type
存储在它自己的数据库表中,并且有一列template
,用于存储每次在活动日志中显示event_type
时将显示的文本/ stream page。
例如
杰森戴维斯为StackOverflow网站创建了一个书签 http://www.stackoverflow.com
对于上面的输出,我们需要将这些项的值存储在实际的Activity事件记录中:
用户名将位于表列中,但其他数据可能是每个event_type的不同类型。
因此在activity_events
数据库表中我有一个名为`entity_meta_json'的列
entity_meta_json' will allow an
activity_event`记录,用于存储事件的额外数据的任何键/值。
然后返回活动日志/流页面,我们将在其中构建我们漂亮的HTML事件视图。我可以从事件template
中取event_type
列,并将模板标记替换为`entity_meta_json'列中任何匹配的键/值。
最终结果是每个Event类型都可以在事件日志/流页面上拥有自己的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}}
现在在演示中它很有效,除非模板有模板标签,表明阵列没有匹配的Key,那么模板标签只会以标签格式显示在最终结果中。
我想替换没有匹配键的模板标签和空格。
因为它现在的工作方式,它遍历数组中的每个键以查找替换,以便那些丢失的键永远不会看到没有数组键的模板标记。
模板将始终与数据库中的标签保持一致。插件开发人员虽然会调用一个函数来添加新的事件记录,但数据可能会丢失一些模板标记键。
一个想法,
如果我还可以解析模板字符串并获取字符串中的所有模板标签,那么我可以将其与用户传入的数据值数组进行比较,并且数组中的任何缺少的键都可以将该键添加到那里数组并将值设置为空,这将使得模板标签在其他标签被检测到时被替换。
所以我的问题是如何在streing中以{{tag_name_here}}
的格式检测所有模板t ags并将每个模板t ags放入一个数组中?
答案 0 :(得分:1)
这样的事情:
$result = preg_replace_callback('~{{([^}]*)}}~', function ($m) use ($jsonArray) {
return isset($jsonArray[$m[1]]) ? $jsonArray[$m[1]] : '';
}, $templateString);
优点是:
$jsonArray
,因为对于字符串中的每个isset
,可能的密钥都会使用{{...}}
进行测试。