Как получить адрес электронной почты из длинной строки - PullRequest
28 голосов
/ 22 июня 2009

В PHP у меня есть такая строка:

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

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

Ответы [ 13 ]

42 голосов
/ 12 января 2011

Опираясь на ответ 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;
}
26 голосов
/ 22 июня 2009

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

filter_var($email, FILTER_VALIDATE_EMAIL)

на каждую подстроку.

15 голосов
/ 15 ноября 2011

на основе константного регулярного выражения .. работает и с доменом 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);
5 голосов
/ 11 ноября 2012

Обновление ответов @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;
}
4 голосов
/ 10 сентября 2014

Этот небольшой скрипт 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,
3 голосов
/ 22 июня 2009

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

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

$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);

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

2 голосов
/ 22 июня 2009

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

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

Подробнее см. В PHP-функции "split".

1 голос
/ 07 ноября 2017
$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));
1 голос
/ 01 апреля 2011

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

(?:[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])+)\])

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

0 голосов
/ 10 июля 2014

Я также изменил ответ @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;  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...