自定义标记与Php

时间:2011-06-27 07:59:23

标签: php

我正在开发一个社交网站。发送通知时,您可以在通知中键入[user:20:name]作为您发送的文本中的开发人员。所以说我发送

“[user:20:name]对您的[视频:8:姓名,链接]视频发表了评论”

它会显示为“Bob评论您的iOS 5评论视频”。

因此它会看到用户,看到用户ID并且我想要名称,然后它将在所需的数据库中完成工作并用Bob替换字符串中的[user:20:name]。

对于视频,它会知道我想要视频8的名称作为链接。我怎么解析这样的东西?我已经知道如何从数据库中获取数据。只是坚持这一部分。知道怎么样?

其中一个想法是通过自己获取每个[标记],并在每个标记上进行解析,然后在获得标记的处理版本时str_replace它。

不确定我如何通过它自己获得每个[标记]。

2 个答案:

答案 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>";