0

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

表:用户

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

4

1 回答 1

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 匹配),然后当用户发布帖子时,您解析帖子并更新该表以及帖子表保存帖子。我还会用以后容易找到的东西替换锚标签。

但是,要按原样回答您的问题,您需要获取字符串并查找锚标记,因此在从数据库中获取帖子后:

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。

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

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

于 2013-09-20T01:57:20.097 回答