【发布时间】:2011-03-04 21:17:53
【问题描述】:
我想使用 PHP 函数从推文中检索所有主题标签。
我知道有人问过类似的问题here,但没有提示如何在 PHP 中准确地实现它。由于我对正则表达式不是很熟悉,所以不知道如何编写一个函数来返回推文中所有主题标签的数组。
那么我该怎么做呢,使用下面的正则表达式:
#\S*\w
【问题讨论】:
我想使用 PHP 函数从推文中检索所有主题标签。
我知道有人问过类似的问题here,但没有提示如何在 PHP 中准确地实现它。由于我对正则表达式不是很熟悉,所以不知道如何编写一个函数来返回推文中所有主题标签的数组。
那么我该怎么做呢,使用下面的正则表达式:
#\S*\w
【问题讨论】:
我创建了自己的解决方案。确实如此:
支持 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
)
【讨论】:
/(#\w+|\p{So})/u
$tweet = "this has a #hashtag a #badhash-tag and a #goodhash_tag";
preg_match_all("/(#\w+)/", $tweet, $matches);
var_dump( $matches );
*破折号是标签的非法字符,允许使用下划线。
【讨论】:
$matches 给出了一个大小为 2 的数组。两个元素都有相同的字符串。也不支持 unicode。
不要忘记包含 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} - 任何非标记空间(重音、变音符号等)
【讨论】:
试试这个正则表达式:
/#[^\s]*/i
如果有多个哈希标签连接在一起(例如#foo#bar),则使用此选项。
/#[^\s#]*/i
运行它的 PHP 看起来像:
preg_match_all('/#[^\s#]*/i', $tweet_string, $result);
结果是一个包含推文中所有主题标签的数组(保存为“$result” - 第三个参数)。
最后,看看这个网站。我发现它对于测试正则表达式非常方便。 http://regex.larsolavtorvik.com/
编辑:我试过你的正则表达式,效果也很好!
编辑 2:添加了另一个正则表达式来提取哈希标签,即使它们是连续的。
【讨论】:
$wholeText = str_replace('#', ' #', $wholeText);
str_replace。例如。 /#[^\s#]*/i
使用preg_match_all()函数:
function get_hashtags($tweet)
{
$matches = array();
preg_match_all('/#\S*\w/i', $tweet, $matches);
return $matches[0];
}
【讨论】: