Как я могу получить все hasgtags в строке в массив?

Мне нужно получить хеш-теги из пользовательского ввода в виде массива.

Входные данные:

$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=$1">$0</a>', $str);
return($str);
}

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

Вместо замены мне нужно $string с тегами в виде массива.

1

Решение

Это должно работать для вас:

Сначала замените все # с пробелом str_replace(). Затем вы можете просто разбить его на массив с preg_split() на 1 или более пробелов (\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+)
  • # буквально соответствует символу #
  • \ Ш + соответствует любому слову слова [A-Za-z0-9_]
    • Квантор: + От одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости [жадный]
4

Другие решения

Попробуйте это регулярное выражение:

(#\S+)

Regex живут здесь.

Разъяснение:

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

Надеюсь, поможет.

2

Зачем использовать RegEx, если в этом нет необходимости?

Ты можешь использовать explode() до тех пор, пока вы хотите разделить строку только на #

$result = $explode('#',$string);

Если вы хотите избавиться от в строках используйте это также:

foreach($result as $entrie){
$entrie = trim($entrie):
}

Это должно решить вашу проблему без использования RegEx.

РЕДАКТИРОВАТЬ

Для части с первым элементом нет # Вы можете использовать это, чтобы справиться с этим:

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

Это удаляет первую запись, если первый символ в строке не #

0

Самый простой способ это

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