如何将字符串中的所有主题标签放入数组中?

How can I get all hasgtags in a string into an array?

我需要从用户输入中获取散列标签作为数组。

输入:

$str = "hello#new #test #again"

预期输出:

Array ( [0] => new [1] => test [2] => again )

我试过这段代码,但它没有按预期工作:

function convertHashtags($str){
    $regex = "/#+([a-zA-Z0-9_]+)/";
    $str = preg_replace($regex, '<a href="hashtag.php?tag=">[=12=]</a>', $str);
    return($str);    
}

$string = "hello#new #test #again";
$string = convertHashtags($string);

我需要 $string 而不是用标签作为数组替换。

这应该适合你:

首先将所有 # 替换为 space 和 str_replace(). Then you can simply split it into an array with preg_split() 1 个或多个 spaces (\s+).

<?php

    $string = "hello#new #test #again";
    $tags = preg_split("/\s+/", str_replace("#", " ", $string));

    print_r($tags);

?>

输出:

Array
(
    [0] => hello
    [1] => new
    [2] => test
    [3] => again
)

编辑:

如果你只想要数组中标签后面的词,只需使用这个:

<?php

    $string = "hello#new#test #again";
    preg_match_all("/#(\w+)/", $string, $m);

    print_r($m[1]);

?>

正则表达式解释:

#(\w+)
  • # 字面上匹配字符#
  • \w+ 匹配任意单词字符 [a-zA-Z0-9_]
    • 量词:+一次到无限次之间,尽可能多次,按需回馈[贪心]

试试这个正则表达式:

(#\S+)

Regex live here.

解释:

( ' start of capturing-group # ' matches a sharp, meaning a new variable \S+ ' anything until next space ) ' and of capturing-group saving

希望对您有所帮助。

如果没有必要,为什么要使用 RegEx?

你可以使用 explode() 只要你只想在 #

处拆分字符串
$result = $explode('#',$string);

如果你想去掉字符串中的 </code> 也可以使用这个:</p> <pre><code>foreach($result as $entrie){ $entrie = trim($entrie): }

这应该可以解决您的问题,而无需使用 RegEx。

编辑

第一个Element没有的部分#可以用这个来处理:

if(strpos($string,'#') === 0)unset($result[0]);

如果字符串中的第一个字符不是 #

,则删除第一个条目

最简单的方法是这样

 $string = "hello#new #test #again";
 $result = explode('#',$string);
 array_shift($result);
 print_R($result);
$list = []; 
$string = "hey hello #new #test #again"; 
$result = explode(' ',$string); 
foreach($result as $res) if (starts_with($res, '#')) $list[]=$res; 
print_r($list);