我目前正在为本地组开发一个轻量级的内部消息传递脚本,该脚本利用自定义的BBCode样式解析器将论坛样式标记(如[b])转换为HTML等效标记。
我还包括一个类似于主题标签的Twitter功能,因此人们可以在消息系统中标记和跟踪讨论,这很有效,直到用户在文本中输入多个主题标签。
通常,用户会将其文本输入到提交表单中。
Lorum Ipsum dolor sit amet, #consectetur adipiscing elit.
使用SQL,讨论跟踪器加载最后20条消息并循环遍历它们,每次调用TrackDiscussion($ i);功能。 $ 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 :(得分: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.' );
答案 1 :(得分: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);
}