Регулярное выражение для сопоставления полного имени с запятой или пробелом

Я работаю с CommonMark и создал парсер @mention, который будет возвращать ссылку при обнаружении @mention. Тем не менее, я настраиваю его, чтобы связать полные имена вместо имен пользователей. Вот что у меня сейчас есть:

$cursor->match('/^\w+,(.*)\s/');

Тем не менее, это, кажется, захватывает имя неправильно и связывает начало другого имени (см. Ниже):

введите описание изображения здесь

У кого-нибудь есть идеи, что я могу изменить, чтобы соответствовать целому имени, разделенному запятой и / или пространство? Я ужасно в написании регулярных выражений.

Спасибо за любую помощь заранее!

Редактировать:

Вот что должно совпадать:

(Имя может содержать не менее 2 слов и не более 3 слов)

  • Бауман, Стив
  • Стив Бауман
  • Доу, Мэри Сью
  • Мэри Сью Доу

Фамилия с запятой будет только быть одним словом.

Что не должно совпадать:

  • Стив
  • Баумана
  • Мэри
  • лань

Регулярное выражение должно соответствовать целому имени, а не отдельным именам.

Это код CommonMark за match метод:

if (!preg_match($regex, $subject, $matches, PREG_OFFSET_CAPTURE)) {
return;
}

Это приводит к:

if (!preg_match('/^\w+,(.*)\s/', "Bauman, Steve", $matches, PREG_OFFSET_CAPTURE)) {
return;
}

0

Решение

В соответствии с вашими новыми правилами, сопоставьте имя, которое состоит из 2 или 3 слов и должно быть разделено пробелами () или запятыми (,)

/\w+([, ]+\w+){1,2}/

Regex 101

3

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

Ну вот

<?php
$string = <<<EOS
something @name, bla bla bla @name.surname something else
Lorem ipsum @o'brien
EOS;

$matches = [];
preg_match_all('/@[^\s,]+/', $string, $matches);
var_dump($matches);

и работает демонстрация

0

По вопросам рекламы [email protected]