В PHP у меня есть строка вроде этого:
$string = "[email protected] MIME-Version: bla bla bla";
Как мне получить адрес электронной почты? Есть ли простой способ получить значение?
В PHP у меня есть строка вроде этого:
$string = "[email protected] 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_-][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);
Обновление ответов @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 скрипт поможет нам извлечь адрес электронной почты из длинного абзаца или текста. Просто скопируйте вставьте этот 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],
Если адрес электронной почты всегда находится впереди строки, самый простой способ получить его - просто разбить строку на все экземпляры символа пробела, а затем просто взять первое значение из результирующего массива.
Конечно, не забудьте проверить, что это похоже на адрес электронной почты, прежде чем использовать его.
Подробнее см. функцию "split" PHP.
Адреса электронной почты действительно сложны для фильтрации с использованием регулярных выражений, потому что существует так много допустимых символов. Это можно сделать, но вам, возможно, придется настроить его, чтобы получить именно то, что вам нужно.
Вы можете начать с чего-то вроде этого:
$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 должен содержать ваш адрес электронной почты.
это сработало для меня
(?:[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.
С помощью регулярных выражений вы можете идентифицировать любой текстовый шаблон в заданной строке. Они невероятно полезны. Поэтому, даже если вы можете использовать копирование фрагмента кода из другого ответа на данный момент, вам стоит подумать о том, чтобы копать немного больше.
Вначале это может быть немного сложным, но это определенно стоит усилий.
Если он действительно разделен пробелом:
php > $matches = array();
php > preg_match('/^[^ ]*/', $string, $matches);
php > print_r($matches[0]);
[email protected]
Соответствует регулярному выражению типа - ([A-Za-z0-9-]+)@([A-Za-z0-9])\\.([a-z]{3})
или что-то подобное.
Я также модифицировал @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;
}
$text = 'First Last <[email protected]>'
$emails = array_filter(filter_var_array(filter_var_array(preg_split('/\s/', $text), FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL));