Как получить адрес электронной почты из длинной строки

В PHP у меня есть строка вроде этого:

$string = "user@domain.com MIME-Version: bla bla bla"; 

Как получить адрес электронной почты только? Есть ли простой способ получить стоимость?

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

 filter_var($email, FILTER_VALIDATE_EMAIL) 

на каждой подстроке.

Основываясь на ответе mandaleeka, сломайте строку с использованием пространственного разделителя, затем используйте filter_var для дезинфекции, затем проверьте, остается ли законным адрес электронной почты:

 function extract_email_address ($string) { foreach(preg_split('/\s/', $string) as $token) { $email = filter_var(filter_var($token, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL); if ($email !== false) { $emails[] = $email; } } return $emails; } 

основанный на регулярном выражении константин .. работает с IP-адресом домена тоже.

 $pattern="/(?:[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/"; //$pattern="/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/"; $subject="Hello a@b.com francis a@b words francisfueconcillo@gmail.com words 2 words123 francis@192.168.0.1"; preg_match_all($pattern, $subject, $matches); 

Обновление ответов @Rob Locken:

 function extract_email_address ($string) { $emails = array(); $string = str_replace("\r\n",' ',$string); $string = str_replace("\n",' ',$string); foreach(preg_split('/ /', $string) as $token) { $email = filter_var($token, FILTER_VALIDATE_EMAIL); if ($email !== false) { $emails[] = $email; } } return $emails; } 

Этот небольшой PHP-скрипт поможет нам извлечь адрес электронной почты из длинного абзаца или текста. Просто скопируйте этот скрипт и сохраните его как файл PHP (extract.php):

 $string="user@domain.com MIME-Version: bla bla bla"; $pattern="/(?:[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/"; preg_match_all($pattern, $string, $matches); foreach($matches[0] as $email){ echo $email.", "; } ?> 

Вышеприведенный скрипт даст следующий результат:

 user@domain.com, 

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

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

Подробнее см. Функцию «split» PHP.

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

Вы можете начать с чего-то вроде этого:

 $string = "user@domain.com MIME-Version: bla bla bla"; $matches = array(); $pattern = '/[A-Za-z0-9_-]+@[A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/' preg_match($pattern,$string,$matches); 

И тогда $ matches должен содержать ваш адрес электронной почты.

это сработало для меня

 (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

обнаруживать любой адрес электронной почты в строке

Если это действительно разделенное пространство:

 php > $matches = array(); php > preg_match('/^[^ ]*/', $string, $matches); php > print_r($matches[0]); user@domain.com 

Посмотрите на регулярные выражения в PHP .

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

Сначала это может быть немного сложным, но это определенно стоит усилий.

Я также изменил ответ @Rob Locke. Я обнаружил, что это не работает для меня, потому что мне пришлось сначала разделить запятыми, а затем пробелами.

 function extract_email_addresses($sString) { $aRet = array(); $aCsvs = explode(',', $sString); foreach($aCsvs as $sCsv) { $aWords = explode(' ', $sCsv); foreach($aWords as $sWord) { $sEmail = filter_var(filter_var($sWord, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL); if($sEmail !== false) $aRet[] = $sEmail; } } return $aRet; } 

Соответствует регулярному выражению типа – ([A-Za-z0-9-]+)@([A-Za-z0-9])\\.([az]{3}) или что-то подобное.

 $text = 'First Last <name@example.com>' $emails = array_filter(filter_var_array(filter_var_array(preg_split('/\s/', $text), FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL));