爆炸多个标签

Exploding Multiple Hashtags

我目前正在为一个本地组开发一个轻量级的内部消息传递脚本,它利用定制的 BBCode 样式解析器,将 [b] 等论坛样式标签翻译成它的 HTML 等价物。

我还加入了一种类似于 Twitter 的话题标签功能,这样人们就可以在消息传递系统中标记和跟踪讨论,效果很好,直到用户在文本中输入多个话题标签。

通常用户会在提交表单中输入他们的文本。

Lorum Ipsum  dolor sit amet, #consectetur adipiscing elit.

使用 SQL,讨论跟踪器加载最后 20 条消息并循环遍历它们,每次调用 TrackDiscussion($i);功能。 $i 参数是输入 text/submission 以检查主题标签的地方。

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>

对于混乱的代码,我深表歉意,但我推测我需要将关键字拆分开来是否正确,很可能是通过 explode 函数?

如果有人能指点我应该把它放在哪里,我将不胜感激,我已经一遍又一遍地检查它,但似乎找不到我的错误。

谢谢

是这样的吗?

function TrackDiscussion( $input ) {
    return preg_replace( "~\#(\w+)~i", '<a href="http://example.com/tag/">#</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.' );

我已将逻辑分解为单独的函数,以使事情尽可能简单。 这就是你想要的吗?

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