【问题标题】:Retrieve all hashtags from a tweet in a PHP function从 PHP 函数中的推文中检索所有主题标签
【发布时间】:2011-03-04 21:17:53
【问题描述】:

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

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

那么我该怎么做呢,使用下面的正则表达式:

#\S*\w

【问题讨论】:

    标签: php regex twitter


    【解决方案1】:

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

    • 查找字符串中的所有主题标签
    • 删除重复的
    • 根据文本中存在的计数对主题标签进行排序
    • 支持 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
    )
    

    【讨论】:

    • +1 为这个问题提供了一个非常好的解决方案,谢谢。
    • @trante 这还能用吗?返回的数组对我来说是空的。字符串的外观或编码方式需要如何?
    • 这不适用于某些 unicode 字符。例如。在泰语中,#รองเท้า 只会得到 #รองเท 泰语元音不包括在内。使用下面的@minaz 方法有效!
    • 表情支持:/(#\w+|\p{So})/u
    【解决方案2】:
    $tweet = "this has a #hashtag a  #badhash-tag and a #goodhash_tag";
    
    preg_match_all("/(#\w+)/", $tweet, $matches);
    
    var_dump( $matches );
    

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

    【讨论】:

    • 请注意,$matches 给出了一个大小为 2 的数组。两个元素都有相同的字符串。也不支持 unicode。
    • 这个表达是我发现的最好的表达之一。
    • 注意:这个正则表达式只会匹配英文单词(因此,#gøypålandet 不会匹配为标签)
    • 你可能需要一个 mbyte 安全的正则表达式函数,在这里无法测试它,抱歉,否则请尝试 @trante 解决方案。
    • 此表达式不支持所有语言。仅适用于经典拉丁字符。
    【解决方案3】:

    不要忘记包含 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} - 任何非标记空间(重音、变音符号等)

    【讨论】:

      【解决方案4】:

      试试这个正则表达式:

      /#[^\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);
      • @SerdarDeğirmenci 你也可以在上面的正则表达式中添加一个散列来达到同样的效果,而无需使用str_replace。例如。 /#[^\s#]*/i
      【解决方案5】:

      使用preg_match_all()函数:

      function get_hashtags($tweet)
      {
          $matches = array();
          preg_match_all('/#\S*\w/i', $tweet, $matches);
          return $matches[0];
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-31
        • 1970-01-01
        • 2016-09-19
        • 2019-11-12
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        相关资源
        最近更新 更多