Regex для извлечения нескольких адресов электронной почты в PHP

Я получаю такой контент, как:

"Jane Doe" <[email protected]>, "John Doe" <[email protected]>

И я хотел бы извлечь адреса электронной почты:

[email protected], [email protected]

В настоящее время у меня есть регулярное выражение, подобное этому:

/<(.*)>/

Который получает все, что находится между скобками, но также получает такие вещи, как:

[email protected]>, "John Doe" <[email protected]

Когда я использовал знак @ посередине, это тоже не сработало:

/<(.*)@(.*)>/

Я мог бы explode() на основе запятой, но я думаю, что должен быть способ, чтобы preg_match() дал мне то, что я хочу. Что мне не хватает в моем регулярном выражении?


person NightHawk    schedule 17.04.2012    source источник


Ответы (4)


Ваше регулярное выражение слишком жадно. Вместо этого используйте /<(.*?)>/, а лучше даже что-то вроде

/<([^<>]+@[^<>]+)>/
person Bergi    schedule 17.04.2012

Я использую это для сопоставления электронных писем, я знаю, что в дикой природе есть другие выражения, которые могут поймать больше адресов электронной почты, но я нахожу это быстрым для ввода и пока удовлетворяет всем моим потребностям, не стесняйтесь попробовать:

/\w+[\.\w]+@\w+[\.\w]+/

Вы можете использовать это с preg_match_all для захвата всех адресов.

Например:

$string = '"Jane Doe" <[email protected]>, "John Doe" <[email protected]>';
preg_match_all('/\w+[\.\w]+@\w+[\.\w]+/', $string, $matches);
print_r($matches);
person Dale    schedule 17.04.2012

Самый простой способ - сопоставить все, кроме последнего разделителя:

/<([^>]*)>/
person GavinCattell    schedule 17.04.2012

Вы включаете слишком много точек. Попробуй это:

/<([^>]*)>/
person JoelFan    schedule 17.04.2012