如何将字符串中的所有主题标签放入数组中?
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+)
解释:
( ' 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);
我需要从用户输入中获取散列标签作为数组。
输入:
$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+)
解释:
( ' 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);