Подтвердить что ты не робот

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

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

$string = "[email protected] MIME-Version: bla bla bla";

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

4b9b3361

Ответ 1

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

filter_var($email, FILTER_VALIDATE_EMAIL)

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

Ответ 2

Основываясь на ответе 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;
}

Ответ 3

основанный на регулярном выражении константин. Работает также с 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_-][email protected][A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/";

$subject="Hello [email protected] francis [email protected] words [email protected] words 2 words123 [email protected]";


preg_match_all($pattern, $subject, $matches);

Ответ 4

Обновление ответов @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;
}

Ответ 5

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

$string="[email protected] 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.", ";
}
?>

Вышеупомянутый script приведет к такому результату:

[email protected],

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

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

php > $matches = array();
php > preg_match('/^[^ ]*/', $string, $matches);
php > print_r($matches[0]);
[email protected]

Ответ 11

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

Ответ 12

Я также модифицировал @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;  
}

Ответ 13

$text = 'First Last <[email protected]>'
$emails = array_filter(filter_var_array(filter_var_array(preg_split('/\s/', $text), FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL));