Разбор адреса электронной почты (ОТ или ДО) с именем - не обязательно соответствует RFC 2822 - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть поле электронной почты, которое может быть отформатировано несколькими различными способами.

  1. hello@world.com

  2. "hello world" <hello@world.com>

  3. hello world <hello@world.com>

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

sed -r  's/"?([^"]+)*"?\s<?([^>]+@[^>]+)>?/["\1","\2"]/' <<< 'Hello World <helloworld@gmail.com>'

Пожалуйста, помогите?

Ответы [ 3 ]

3 голосов
/ 18 апреля 2011

Обновление:

Это должно делать то, что вы хотите:

^(?:"?([^@"]+)"?\s)?<?([^>]+@[^>]+)>?$

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

2 голосов
/ 18 апреля 2011

Регулярное выражение выглядит не совсем правильно.В любом случае, во время выполнения этого регулярного выражения возникает ошибка «Ограничение возврата назад» (вы можете проверить это с помощью функции preg_last_error), поэтому вы можете увеличить предел возврата, чтобы он заработал:

 ini_set('pcre.backtrack_limit', 1000000);
 var_dump(preg_replace('~"?([^"]+)*"?\s<?([^>]+@[^>]+)>?~', '["$1","$2"]', 'hello@world.com'));

вывод:

 string(15) "hello@world.com"
1 голос
/ 18 апреля 2011

Рубин (1,9 +)

$ ruby -e 'p gets.scan(/"?([^"]+)*"?\s<?([^>]+@[^>]+)>?/)' <<< '"Hello World" <helloworld@gmail.com>'
[["Hello World", "helloworld@gmail.com"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...