Как получить строку в регулярном выражении и удалить другую после сопоставления строки - PullRequest
0 голосов
/ 10 ноября 2018

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

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

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

пока я делаю это выражение

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

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

1 бла-бла-бла @ имя пользователя _.

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

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

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

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

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

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

@\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 голосов
/ 10 ноября 2018

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

"/^.*\@([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

...