мой вклад следующий
1 бла бла бла @username_. сблах сблах сблах
вывод мне нужен следующий
username_.
сейчас я делаю это выражение
^.*\@([a-zA-Z0-9\.\_]+)$
который работает в следующем
1 бла бла бла @username_.
но если я использую его для полной строки, это не работает
так что его получить пользователь и удалить перед пользователем
но как я могу сделать так, чтобы удалить остальное, как только он получает пользователя
Примечание. Я использую regex101 для тестирования, если у вас есть лучший инструмент, напишите его ниже.
Ваш шаблон использует ^$
Это означает, что требуется полное совпадение, ваш шаблон является лишь частичным.
Добавляя .*
он становится полным регулярным выражением и соответствует ожидаемому.
"/^.*\@([a-zA-Z0-9\.\_]+).*$/"
Другой способ сделать это — использовать частичное регулярное выражение, подобное этому.
Он пропускает что-нибудь до @, а затем записывает все в точку
$str = "1 blah blah blah @username_. sblah sblah sblah";
preg_match("/.*?\@(.*?\.)/", $str, $match);
var_dump($match);
Чтобы соответствовать имени пользователя в ваших данных примера, вы могли бы preg_match и опустить $
утверждать позицию в конце строки, как в этом демонстрация. Обратите внимание, что вам не нужно избегать @
и точка и подчеркивание в классе символов.
Чтобы получить имя пользователя в данных примера, вы также можете использовать:
@\K[\w.]+
Это будет соответствовать
@
Подходим буквально\K
Забудьте, что было ранее найдено[\w.]+
Совпадение 1+ раз слово символ или точка$re = '/@\K[\w.]+/';
$str = '1 blah blah blah @username_. sblah sblah sblah @test';
preg_match($re, $str, $matches);
echo $matches[0]; // username_.