Я работаю с 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;
}
В соответствии с вашими новыми правилами, сопоставьте имя, которое состоит из 2 или 3 слов и должно быть разделено пробелами () или запятыми (,)
/\w+([, ]+\w+){1,2}/
Ну вот
<?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);
и работает демонстрация