Как получить строку в регулярном выражении и удалить другую после сопоставления строки

мой вклад следующий

1 бла бла бла @username_. сблах сблах сблах

вывод мне нужен следующий
username_.

сейчас я делаю это выражение

^.*\@([a-zA-Z0-9\.\_]+)$

который работает в следующем

1 бла бла бла @username_.

но если я использую его для полной строки, это не работает

так что его получить пользователь и удалить перед пользователем
но как я могу сделать так, чтобы удалить остальное, как только он получает пользователя

Примечание. Я использую regex101 для тестирования, если у вас есть лучший инструмент, напишите его ниже.

0

Решение

Ваш шаблон использует ^$ Это означает, что требуется полное совпадение, ваш шаблон является лишь частичным.
Добавляя .* он становится полным регулярным выражением и соответствует ожидаемому.

"/^.*\@([a-zA-Z0-9\.\_]+).*$/"

https://3v4l.org/i4pVd

Другой способ сделать это — использовать частичное регулярное выражение, подобное этому.
Он пропускает что-нибудь до @, а затем записывает все в точку

$str = "1 blah blah blah @username_. sblah sblah sblah";
preg_match("/.*?\@(.*?\.)/", $str, $match);

var_dump($match);

https://3v4l.org/mvBYI

1

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

Чтобы соответствовать имени пользователя в ваших данных примера, вы могли бы preg_match и опустить $ утверждать позицию в конце строки, как в этом демонстрация. Обратите внимание, что вам не нужно избегать @ и точка и подчеркивание в классе символов.

Чтобы получить имя пользователя в данных примера, вы также можете использовать:

@\K[\w.]+

Это будет соответствовать

  • @ Подходим буквально
  • \K Забудьте, что было ранее найдено
  • [\w.]+ Совпадение 1+ раз слово символ или точка

Regex demo

$re = '/@\K[\w.]+/';
$str = '1 blah blah blah @username_. sblah sblah sblah @test';
preg_match($re, $str, $matches);
echo $matches[0]; // username_.

Демо php

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector