2016-07-11 4 views
0

私は現在、カスタムのBBCodeスタイルのパーサーを使用して、[b]のようなフォーラムスタイルのタグをHTMLに相当するものに変換する、ローカルグループ用の軽量の内部メッセージングスクリプトを開発しています。複数のハッシュタグを爆発

ハッシュタグのようなTwitter機能も含まれているので、ユーザーがテキストに複数のハッシュタグを入力するまでは、メッセージングシステム内で議論をタグ付けして追跡することができます。

一般的に、ユーザーはテキストをそのまま送信フォームに入力します。

SQLを使用すると、ディスカッショントラッカーはTrackDiscussion($ i)を呼び出すたびに最後の20個のメッセージとループを読み込みます。関数。 $ iパラメータは、ハッシュタグをチェックするためにテキスト/サブミッションが供給される場所です。

function TrackDiscussion($i,$str=1) { 
    $keywords=""; 
    preg_match_all('/#(\w+)/',$i,$matches); 
    $i = 0; 
    if($str){ 
     foreach($matches[1] as $match) { 
      $count=count($matches[1]); 
      $keywords .= "$match"; 
      $i++; 
      if ($count>$i) $keywords .= ", "; 
     } 
    } 
    else{ 
     foreach($matches[1] as $match) { 
      $keyword[]=$match; 
     } 
     $keywords=$keyword; 
    } 
    return $keywords; 
} 

このすべては、それがテキストに複数のハッシュタグを見つけるまで、正常に動作し、代わりの出力:

<a href="http://example.com/tag/hashtag1">#hashtag1</a>, <a href="http://example.com/tag/hashtag2">#hashtag2</a> 

それは出力:

<a href="http://example.com/tag/hashtag1,hashtag2">#hashtag1, #hashtag2</a> 

私は乱雑に謝罪しかし、私は、キーワードを分割する必要があると推測するのは間違いないでしょう。ほとんどの場合、爆発関数でしょうか?

誰かが私にそれをどこに置くかについてのポインタを私に与えることができれば、私は感謝以上のものになるでしょう。私はそれを何度も繰り返してきました。このような

おかげ

+0

実際にリンクを生成するコードは、おそらく問題だものです。 – apokryfos

+0

ツアーハッシュタグは$ keywordsに文字列として格納され、文字列を連結します。 trackDiscussion()から文字列を戻さず、配列を返します。 –

答えて

2

何か?

function TrackDiscussion($input) { 
    return preg_replace("~\#(\w+)~i", '<a href="http://example.com/tag/$1">#$1</a>', $input); 
} 

echo TrackDiscussion('Lorum #Ipsum dolor sit amet, #consectetur adipiscing #elit.'); 

ハッシュタグのリンクのみが含まれていますか?

function TrackDiscussion2($input) { 
    preg_match_all("~\#(\w+)~i", $input, $matches); 
    $return = array(); 
    foreach($matches[1] as $match) { 
     $return[] .= '<a href="http://example.com/tag/'.$match.'">#'.$match.'</a>'; 
    } 
    return implode(', ', $return); 
} 

echo TrackDiscussion2('Lorum #Ipsum dolor sit amet, #consectetur adipiscing #elit.'); 
+0

助けてくれてありがとう、それは今完璧に動作しています。なぜ簡単な答えが時々私を逃れさせるのか分かりません。答えとしてマーク。 – AlbrightK

1

私はできるだけシンプルにするためにロジックを別々の関数に分割しました。 これはあなたの後ですか?

$last20Messages = array(
    'This is just some random stuff. #random #stuff', 
    'And some more. #some #more', 
); 
echo getTagLinksForMessages($last20Messages); 

出力:

<a href='/tag/random'>#random</a> 
<a href='/tag/stuff'>#stuff</a> 
<a href='/tag/some'>#some</a> 
<a href='/tag/more'>#more</a> 

と関数の定義:

/** 
* @param string $message 
* @return array 
*/ 
function getTagsFromMessage($message) 
{ 
    preg_match_all('/#(\w+)/', $message, $matches); 
    return $matches[1]; 
} 

/** 
* @param array|string[] $messages 
* @return array 
*/ 
function getTagsFromMessages(array $messages) 
{ 
    $tags = []; 
    foreach ($messages as $message) { 
     $messageTags = getTagsFromMessage($message); 
     $tags = array_merge($tags, $messageTags); 
    } 
    $tags = array_unique($tags); 

    // You can then sort the tags here. E.g. alphabetical order. 
    return $tags; 
} 

/** 
* @param array $tags 
* @return string 
*/ 
function getTagLinksString(array $tags) 
{ 
    $result = ''; 
    foreach ($tags as $tag) { 
     $result .= "<a href='/tag/{$tag}'>#{$tag}</a>"; 
    } 
    return $result; 
} 

/** 
* @param array $messages 
* @return string 
*/ 
function getTagLinksForMessages(array $messages) 
{ 
    $tags = getTagsFromMessages($messages); 
    return getTagLinksString($tags); 
} 
+0

あなたとロン・ファン・デル・ヘイデンの答えは素晴らしいです。グループが最終版でどのように行動するかによって、Ron'sはテキスト内のハッシュタグを強調表示するのに便利で、テキストの余分なテキストなしで小さなタグのリストが必要な場合に便利です。 (ロンは受け入れられた答えですが、私もあなたもアップします) – AlbrightK