PHP - Как определить адреса электронной почты из входных данных, содержащих строки разнородных данных - PullRequest
0 голосов
/ 11 сентября 2010

Заранее извиняюсь за еще один запрос соответствия шаблону электронной почты. Вот что у меня есть:

$text = strtolower($intext);
$lines = preg_split("/[\s]*[\n][\s]*/", $text);
$pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/';
$pattern1= '/^[^@]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$/';
foreach ($lines as $email) {
preg_match($pattern,$email,$goodies);
$goodies[0]=filter_var($goodies[0], FILTER_SANITIZE_EMAIL);
if(filter_var($goodies[0], FILTER_VALIDATE_EMAIL)){
array_push($good,$goodies[0]);
}
}

$ Pattern работает нормально, но адреса .rr.com (и другие проблемы, я уверен) лишены .com

$ pattern1 получает только те письма, которые находятся на одной линии.

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

Все отлично работает, за исключением писем с более чем одним "." или до или после "@".

Я уверен, что должно быть и больше проблем.

Я пробовал несколько шаблонов, которые я нашел, а также несколько, которые я пытался написать.

Может кто-нибудь показать мне свет здесь, прежде чем я вытащу оставшиеся волосы?

1 Ответ

0 голосов
/ 11 сентября 2010

Как насчет этого?

/((?:\w+[.]*)*(?:\+[^@ \t]*)?@(?:\w+[.])+\w+)/

Объяснение: (?:\w+[.])* распознает 0 или более экземпляров строк символов слова (буквенно-цифровой + _), необязательно разделенных строками точек.Затем (?:\+[^@ \t]*)? распознает знак плюс, за которым следуют ноль или более непробельных символов без знака.Затем у нас есть знак @ и, наконец, (?:\w+[.])+\w+, который соответствует последовательности строк символов слова, разделенных точками и заканчивающихся строкой символа слова.(т. е. [subdomain.] domain.topleveldomain)

...