Мне нужно получить хеш-теги из пользовательского ввода в виде массива.
Входные данные:
$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
с тегами в виде массива.
Это должно работать для вас:
Сначала замените все #
с пробелом 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+)
Попробуйте это регулярное выражение:
(#\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);
Если вы хотите избавиться от в строках используйте это также:
foreach($result as $entrie){
$entrie = trim($entrie):
}
Это должно решить вашу проблему без использования RegEx.
РЕДАКТИРОВАТЬ
Для части с первым элементом нет #
Вы можете использовать это, чтобы справиться с этим:
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);