我正在一个社交网站上工作。例如,发送通知时,您可以在发送的文本中以开发人员身份在通知中键入 [user:20:name]。所以说我发送
“[user:20:name] 对您的 [video:8:name,link] 视频发表了评论”
它将显示为“Bob 对您的 iOS 5 评论视频发表了评论”。
所以它会看到用户,看到用户 ID 以及我想要的名称,然后它会在它需要的数据库中完成工作,并将字符串中的 [user:20:name] 替换为 Bob。
对于视频,它会知道我想要视频 8 的名称作为链接。我将如何解析这样的东西?我已经知道如何从数据库中获取数据。就卡在这部分了。知道怎么做吗?
其中一个想法是单独获取每个[标记],并对每个标记进行解析,然后在获得标记的处理版本时 str_replace 它。
不确定我如何自己获得每个[标记]。
最佳答案
不确定这是否太简单,它不处理字符串中的多个标签,但您可以尝试这样的方法作为起点:
<?php
// the original string
$str = 'User [user:20:name] did foo bar.';
// find the tag
preg_match('/(?<=\[)[a-z0-9:]+(?=\])/', $str, $tags);
// build a db query
list($table, $id, $field) = explode(':', $tags[0]);
$sql = sprintf('SELECT %s FROM %s WHERE id = %d', $field, $table, $id);
// DB query... returns user 'Bob'
$user = 'Bob';
// replace the original tag with the user's name
$output = preg_replace('/\[user:\d+:name\]/', $user, $str);
更新
对于多个标签,您可以使用 preg_match_all()
,然后迭代 $tags
数组,可能使用 $table
变量作为构建查询数据数组的关键...您必须根据您的数据库实现来决定使用此数据查询数据库的最有效方法。如果你可以使用 PDO 准备好的语句可能会很好。因此会缓存您的输出,因为您不想每次都预匹配并替换所有输出...或者只执行一次此操作并将输出存储在数据库中。
关于php - 使用 Php 自定义标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6490063/