从PHP函数中的tweet中检索所有主题标签

问题描述 投票:22回答:5

我想使用PHP函数从推文中检索所有主题标签。

我知道有人问了类似的问题here,但没有提示如何在PHP中实现这一点。由于我对正则表达式不是很熟悉,所以不知道如何编写一个函数来返回推文中所有主题标签的数组。

那么我该如何使用以下正则表达式执行此操作:

#\S*\w
php regex twitter
5个回答
32
投票
$tweet = "this has a #hashtag a  #badhash-tag and a #goodhash_tag";

preg_match_all("/(#\w+)/", $tweet, $matches);

var_dump( $matches );

*破折号是标签的非法字符,允许使用下划线。


31
投票

我创建了自己的解决方案。它确实:

  • 查找字符串中的所有主题标签
  • 删除重复的
  • 排序关于文本中存在计数的主题标签
  • 支持unicode字符 function getHashtags($string) { $hashtags= FALSE; preg_match_all("/(#\w+)/u", $string, $matches); if ($matches) { $hashtagsArray = array_count_values($matches[0]); $hashtags = array_keys($hashtagsArray); } return $hashtags; }

输出是这样的:

(
    [0] => #_ƒOllOw_
    [1] => #FF
    [2] => #neslitükendi
    [3] => #F_0_L_L_O_W_
    [4] => #takipedeğerdost
    [5] => #GönüldenTakipleşiyorum
)

15
投票

不要忘记包含unicode,数值和下划线的主题标签:

$tweet = "Valid hashtags include: #hashtag #NYC2016 #NYC_2016 #gøypålandet!";

preg_match_all('/#([\p{Pc}\p{N}\p{L}\p{Mn}]+)/u', $tweet, $matches);

print_r( $matches );

\ p {Pc} - 匹配下划线

\ p {N} - 任何脚本中的数字字符

\ p {L} - 来自任何语言的信件

\ p {Mn} - 任何非标记空间(重音符号,变音符号等)


5
投票

试试这个正则表达式:

/#[^\s]*/i

如果有多个哈希标签连接在一起(例如#foo #bar),请使用此方法。

/#[^\s#]*/i

运行它PHP看起来像:

preg_match_all('/#[^\s#]*/i', $tweet_string, $result);

结果是一个包含Tweet中所有主题标签的数组(保存为“$ result” - 第三个参数)。

最后,看看这个网站。我发现测试正则表达式非常方便。 http://regex.larsolavtorvik.com/

编辑:我尝试了你的正则表达式,它也很棒!

编辑2:添加另一个正则表达式来提取哈希标记,即使它们是连续的。


4
投票

使用preg_match_all()函数:

function get_hashtags($tweet)
{
    $matches = array();
    preg_match_all('/#\S*\w/i', $tweet, $matches);
    return $matches[0];
}
© www.soinside.com 2019 - 2024. All rights reserved.