2016-07-11 17 views
0

Ich entwickle gerade ein leichtgewichtiges internes Nachrichtenskript für eine lokale Gruppe, das einen benutzerdefinierten BBCode-Stil-Parser verwendet, um Forum-Stil-Tags wie [b] in sein HTML-Äquivalent zu übersetzen.Explodierende Mehrfach-Hashtags

Ich habe auch eine Twitter-ähnliche Hashtag-Funktion hinzugefügt, so dass Leute Diskussionen im Messaging-System taggen und verfolgen können, was gut funktioniert, bis der Benutzer mehr als einen Hashtag in den Text eingibt.

Normalerweise würde der Benutzer seinen Text in das Übermittlungsformular als solches eingeben.

Lorum Ipsum dolor sit amet, #consectetur adipiscing elit. 

SQL verwenden, die Diskussion Tracker lädt die letzten 20 Meldungen und Schleifen durch sie jedes Mal die TrackDiscussion Aufruf ($ i); Funktion. Der Parameter $ i ist der Ort, an dem der Text/die Vorlage eingegeben wird, um nach Hashtags zu suchen.

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

Das alles funktioniert gut, bis es mehr als ein Hashtag im Text findet, und statt der Ausgabe:

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

Es gibt:

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

ich die unordentlichen entschuldigen Code, aber hätte ich recht damit zu glauben, dass ich die Keywords auseinander spalten müsste, am ehesten durch die Explode-Funktion?

Wenn mir jemand einen Hinweis geben könnte, wo ich das hinbringen würde, wäre ich mehr als dankbar, ich habe es immer und immer wieder durchgegangen und ich kann meinen Fehler nicht finden.

Dank

+0

Der Code, der die Links tatsächlich erzeugt, ist wahrscheinlich derjenige, der das Problem. – apokryfos

+0

Tour-Hashtag werden als String in $ keywords gespeichert, Sie verketten Strings. Gib keine Zeichenfolge von trackDiscussion() zurück, gib ein Array zurück. –

Antwort

2

So etwas wie das?

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.'); 

Oder nur Hashtag-Links enthalten?

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

Danke für die Hilfe, es funktioniert jetzt perfekt. Ich weiß nicht, warum mir eine einfache Antwort manchmal entgeht. Als Antwort markiert. – AlbrightK

1

Ich habe die Logik heraus in getrennte Funktionen gebrochen, um die Dinge so einfach wie möglich zu machen. Sind Sie danach?

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

Ausgänge:

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

Und die Funktionsdefinitionen:

/** 
* @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

Ihre und Ron van der Heijdens Antwort sind brillant. Je nachdem, wie die Gruppe in der endgültigen Version agieren möchte, ist Ron nützlich, um die Hashtags im Text hervorzuheben. Ihre ist nützlich, wenn eine kleine Liste von Tags ohne den zusätzlichen Text benötigt wird. (Während Rons die akzeptierte Antwort ist, werde ich auch deine aufwerten) – AlbrightK