Чтобы сопоставить адреса электронной почты для примера строки, вы можете использовать группу захвата и привязку \G
для получения непрерывных совпадений после сопоставления первой части строки.
(?:[^\s<>]+<|\G(?!^))([^\s@<>]+@[^\s@<>]+)>(?:,\h*|$)
Объяснение
(?:
Группа без захвата [^\s<>,]+<
Соответствует 1+ раз любому символу, кроме символа пробела или скобок |
Или \G(?!^)
Подтвердить позицию в конце предыдущего совпадения
)
Закрыть группу (
Захват группа 1 [^\s@<>]+@[^\s@<>]+
Соответствие шаблону электронной почты с использованием отрицательного класса символов
)
Закрыть группу 1 >(?:,\h*|$)
Сопоставьте >
и запятую и 0+ горизонтальных пробелов или подтвердите конец строки
Regex demo | Php демонстрация
Например
$re = '/(?:[^\s<>]+<|\G(?!^))([^\s@<>]+@[^\s@<>]+)>(?:,\h*|$)/';
$str = 'test<test@test.com>, test1<test1@test.com>,test2<test2@test.com>';
preg_match_all($re, $str, $matches);
print_r($matches[1]);
Вывод
Array
(
[0] => test@test.com
[1] => test1@test.com
[2] => test2@test.com
)