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

Php 如何过滤字符串以提取符号后的文本?,php,regex,function,hash,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 b

我有一个函数,可以从标签中过滤文本

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, ',');
        }
因此,在我的post文件中,变量使用gethashtags()来提取文本,但仅当字符串有一个#.#成为触发因素

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

什么功能可以达到这个效果?我一点也不理解Regex的意思,所以如果这个问题像我尽力解释我的问题那样含糊不清,我很抱歉


提前感谢

我将简化您的函数,如下所示:

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
我建议
/([@#][^^^^#]\S*)/g
获取所有内容。。和#

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

输入,预期输出会更好。输入是一种可以输入任何内容的形式。例如,输入可以是“Hello everyone”,因此函数会忽略它,但输入也可以是“@Callum Hello!#hashtag”,因此函数必须提取两段文本(Callum和hashtag),以便将它们存储到数据库中。您的意思是,您能帮我将其放入类似于上述的函数中吗?我只需要
^.*.@(\S+).*$
部分我喜欢这个!非常感谢你@我很高兴能帮上忙。