爆炸多个标签
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);
}
我目前正在为一个本地组开发一个轻量级的内部消息传递脚本,它利用定制的 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);
}