如何过滤字符串以在符号后提取文本?

时间:2014-07-26 16:09:24

标签: php regex function hash

我有一个可以过滤标签

中文本的功能
function gethashtags($text)
        {
          //Match the hashtags
          preg_match_all('/(^|[^a-z0-9_])#([a-z0-9_]+)/i', $text, $matchedHashtags);
          $hashtag = '';
          // For each hashtag, strip all characters but alpha numeric
          if(!empty($matchedHashtags[0])) {
              foreach($matchedHashtags[0] as $match) {
                  $hashtag .= preg_replace("/[^a-z0-9]+/i", "", $match).',';
              }
          }
            //to remove last comma in a string
        return rtrim($hashtag, ',');
        }

所以在我的帖子文件中,变量使用gethashtags()来提取文本,但前提是字符串有#。 #是触发器。

我需要的只是一个类似的函数,但使用@作为触发器而不是哈希。

什么功能可以达到这个效果?我不明白正则表达式,所以我很抱歉,如果这个问题模糊不清,我会尽最大努力解释我的问题。

先谢谢!

2 个答案:

答案 0 :(得分:1)

我会像这样简化你的功能:

function gethashtags($text) {
   preg_match_all('/\B[@#]\K\w+/', $text, $matches);
   return implode(',', $matches[0]);
}
echo gethashtags("@Callum Hello! #hashtag @another #hashtag");

<强>解释

  • 正则表达式的(^|[^a-z0-9_])部分就像非字边界\B一样。
  • 然后我们匹配@#字符。 \K抛弃了与此相匹配的所有内容。
  • 然后我们简单地匹配任何一个字符后面的单词字符并简单地破坏结果。

<强>输出

Callum,hashtag,another,hashtag

答案 1 :(得分:1)

我建议/([@#][^@^#]\S*)/g获取所有@ ..和#..

http://regex101.com/r/gD2oI8/2

使用$sMatch{0},您可以查看@或# 或者移动“[]”后面的“(”)跳过它: - )