我正在开发一个社交网站。发送通知时,您可以在通知中键入[user:20:name]作为您发送的文本中的开发人员。所以说我发送
“[user:20:name]对您的[视频:8:姓名,链接]视频发表了评论”
它会显示为“Bob评论您的iOS 5评论视频”。
因此它会看到用户,看到用户ID并且我想要名称,然后它将在所需的数据库中完成工作并用Bob替换字符串中的[user:20:name]。
对于视频,它会知道我想要视频8的名称作为链接。我怎么解析这样的东西?我已经知道如何从数据库中获取数据。只是坚持这一部分。知道怎么样?
其中一个想法是通过自己获取每个[标记],并在每个标记上进行解析,然后在获得标记的处理版本时str_replace它。
不确定我如何通过它自己获得每个[标记]。
答案 0 :(得分:4)
不确定这是否太简单,它不处理字符串中的多个标签,但您可以尝试这样的东西作为起点:
<?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
变量作为构建查询数据数组的键...您' d必须根据您的数据库实现决定使用此数据查询数据库的最有效方法。如果可以使用PDO编写的语句可能会很好。所以会缓存你的输出,因为你不想每次都匹配并替换所有的输出......或者只是执行一次这个操作并将输出存储在数据库中。
答案 1 :(得分:0)
你的意思是这样吗?
<?php
$string = "[video:8:name,link]";
$string = trim($string, "[]");
$videoMetaData = explode(",", $string);
$nameArray = explode(":", $videoMetaData[0]);
$name = $nameArray[2];
$link = $videoMetaData[1];
echo "<a href='".$link."'>".$name."</a>";