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 でこれを直接実行できると確信していますが、実際にはそうしません。多くの場合、壊れる可能性があります。

1 つの方法は、2 番目のタグ テーブル (taged_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 に答える