根据锚标记的存在加入查询?

时间:2013-09-20 01:02:05

标签: php mysql

为了方便起见,我简化了下面的脚本。

表:用户

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

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。

您可以看到预先解析帖子并提取该信息会更容易,这可能很容易,具体取决于您实现插入标记的方式。

如果锚点嵌入帖子中,您可以将每个锚点的开始/结束焦点位置存储在标签表中,以便以后轻松更换。