为了方便起见,我简化了下面的脚本。
表:用户
id | username | location
12 | best_chef | SF, CA
15 | muffin_girl | Miami, FL
表:列表
post_id | userid | post
95 | 15 | check out my new recipe!
96 | 12 | I love <a href="profile.php?id=$12">best_chef</a> 's recipes
以下是我用于显示帖子的 SQL查询:
$table = query("SELECT id, post, post_id, username FROM list, users WHERE list.userid = users.id");
HTML:
<div class="update">
<div class="user"><?php echo $usermame ?></div> //"muffin_girl"
<div class="post"><?php echo $post ?></div> // "i love best_chef's recipes"
</div>
我要做的是添加一个弹出框,在帖子的锚点悬停时,会在帖子中显示标记为的人的位置。这样的事情:
<div class="popup"><?php echo location ?></div
问题:
如何加入帖子的锚标记和用户的位置?另外,并非所有帖子都包含锚标记。
这可行吗?我有一种感觉,我正在思考这个。
修改
所需的输出/伪代码:
$sql = "SELECT post, username, location FROM list, users WHERE post like '%{TODO:anchor text}%' = users.username LIMIT 1";
答案 0 :(得分:1)
我想我得到的是你所要求的,基本上如果有人发帖:
I love <a href="profile.php?id=$12">best_chef</a> 's recipes
然后你想截取<a href...>...</a>
,提取id($12
),并添加一个隐藏的DIV,它会在悬停在锚点上时弹出。
我确信你可以直接在mySQL中使用涉及正则表达式等的可怕查询来执行此操作 - 但我真的不会。它很可能会打破很多时间。
一种方法是拥有第二个标记表(将tagged_user_id与post_id匹配),然后当用户发布时,您解析帖子并更新该表以及posts表保存帖子。我还会用以后容易找到的东西替换锚标签。
但是,要回答你的问题,你需要拿字符串然后去寻找锚标签,所以在从数据库中获取帖子之后:
if (preg_match_all('/<a href="profile\.php.id=\$([^"]*)">[^<]*<\/a>/', $str, $matches)) {
print_r($matches);
// $matches[1] is an array of the ids mentioned, so you can
// query the database again to get the information
}
这使用与整个链接匹配的正则表达式,但前提是它的格式与您的示例完全相同。您可能需要处理额外的空格,不同的引用等,具体取决于生成链接的方式。
代表
$str = "I love <a href=\"profile.php?id=$12\">best_chef</a> 's recipes. ";
这给出了输出:
Array
(
[0] => Array
(
[0] => href="profile.php?id=$12
)
[1] => Array
(
[0] => 12
)
)
现在,您可以再次查询数据库并在呈现帖子之前插入div。
您可以看到预先解析帖子并提取该信息会更容易,这可能很容易,具体取决于您实现插入标记的方式。
如果锚点嵌入帖子中,您可以将每个锚点的开始/结束焦点位置存储在标签表中,以便以后轻松更换。