regex — Как проверить адрес электронной почты в переполнении стека

У меня есть эта функция для проверки адресов электронной почты:

function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

return (bool)preg_match($v, $EMAIL);
}

Это нормально для проверки правильности адреса электронной почты?

187

Решение

Самый простой и безопасный способ проверить правильность адреса электронной почты — это использовать filter_var() функция:

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}

Кроме того, вы можете проверить, определяет ли домен MX запись:

if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}

Но это все еще не гарантирует, что почта существует. Единственный способ узнать это — отправить письмо с подтверждением.


Теперь, когда у вас есть простой ответ, не стесняйтесь читать о проверке адреса электронной почты, если вы хотите узнать или иначе просто использовать быстрый ответ и двигаться дальше. Никаких обид.

Попытка подтвердить адрес электронной почты с помощью регулярных выражений является «невозможной» задачей. Я бы сказал, что это регулярное выражение бесполезно. Есть три RFC, касающиеся адресов электронной почты и написания регулярных выражений для перехвата неправильных адресов электронной почты, и в то же время отсутствие ложных срабатываний — это то, что не может сделать ни один смертный. Проверять, выписываться этот список для тестов (как неудачных, так и успешных) регулярных выражений, используемых PHP filter_var() функция.

Даже встроенные функции PHP, почтовые клиенты или серверы не понимают это правильно. Все еще в большинстве случаев filter_var это лучший вариант.

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

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

  • rfc5322
  • RFC5321
  • rfc3696
  • rfc6531 (допускает символы Юникода, хотя многие клиенты / серверы не принимают его)

Обратите внимание, что filter_var() как уже говорилось, доступно только с PHP 5.2. Если вы хотите, чтобы он работал с более ранними версиями PHP, вы можете использовать регулярное выражение, используемое в PHP:

<?php

$pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';

$emailaddress = 'test@gmail.com';

if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}

Постскриптум Примечание к шаблону регулярных выражений, использованному выше (из источника PHP). Похоже, что на это Майкл Руштон. Как указано: «Не стесняйтесь использовать и распространять этот код. Но, пожалуйста, сохраните это уведомление об авторских правах».

498

Другие решения

Ты можешь использовать filter_var за это.

<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
36

По моему опыту, regex решения имеют слишком много ложных срабатываний и filter_var() решения имеют ложные негативы (особенно со всеми новыми ДВ).

Вместо этого лучше убедиться, что адрес содержит все необходимые части адреса электронной почты (пользователь, символ «@» и домен), а затем убедиться, что сам домен существует.

Невозможно определить (на стороне сервера), существует ли пользователь электронной почты для внешнего домена.

Это метод, который я создал в классе Utility:

public static function validateEmail($email)
{
// SET INITIAL RETURN VARIABLES

$emailIsValid = FALSE;

// MAKE SURE AN EMPTY STRING WASN'T PASSED

if (!empty($email))
{
// GET EMAIL PARTS

$domain = ltrim(stristr($email, '@'), '@') . '.';
$user   = stristr($email, '@', TRUE);

// VALIDATE EMAIL ADDRESS

if
(
!empty($user) &&
!empty($domain) &&
checkdnsrr($domain)
)
{$emailIsValid = TRUE;}
}

// RETURN RESULT

return $emailIsValid;
}
10

Я думаю, что вам лучше использовать встроенный PHP фильтры — в данном конкретном случае:

Может возвращать истину или ложь при наличии FILTER_VALIDATE_EMAIL пары.

8

Это не только проверит вашу электронную почту, но и очистит ее от неожиданных символов:

$email  = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);

if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
$emailB != $email
) {
echo "This email adress isn't valid!";
exit(0);
}
7

Ответили на это в «верхнем вопросе» о проверке электронной почты https://stackoverflow.com/a/41129750/1848217

Для меня правильный способ проверки электронной почты:

  1. Убедитесь, что символ @ существует, и до и после него есть не-@ символы: /^[^@]+@[^@]+$/
  2. Попробуйте отправить электронное письмо на этот адрес с некоторым «кодом активации».
  3. Когда пользователь «активирует» свой адрес электронной почты, мы увидим, что все правильно.

Конечно, вы можете показать некоторые предупреждения или всплывающую подсказку в пользовательском интерфейсе, когда пользователь
набрал «странный» адрес электронной почты, чтобы помочь ему избежать распространенных ошибок, как нет
точка в доменной части или пробелы в имени без кавычек и так далее. Но
Вы должны принять адрес «hello @ world», если пользователь действительно этого хочет.

Кроме того, вы должны помнить, что стандартный адрес электронной почты был и может
evolute, так что вы не можете просто набрать некоторое «стандартно-действительное» регулярное выражение один раз и
на все времена. И вы должны помнить, что какой-то конкретный интернет
серверы могут не работать с некоторыми деталями общего стандарта и фактически работать с
собственный «модифицированный стандарт».

Итак, просто отметьте @, назовите пользователя на веб-интерфейс и отправьте письма с подтверждением на указанный адрес.

2

Если вы просто ищете фактическое регулярное выражение, которое учитывает различные точки, подчеркивания и тире, оно выглядит следующим образом: [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+, Это позволит довольно глупо выглядеть как tom_anderson.1-neo@my-mail_matrix.com быть подтвержденным.

1

Если вы хотите проверить, если предоставленный домен с адреса электронной почты допустимо, используйте что-то вроде:

/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
function check_email_domain($email) {
//Get host name from email and check if it is valid
$email_host = explode("@", $email);
//Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
$host = end($email_host) . ".";
//Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)
}
}

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

Обратите внимание, что idn_to_ascii() (или его сестра функции idn_to_utf8()) функция может не быть доступно в вашей установке PHP, требует расширения PECL intl> = 1.0.2 и PECL idn> = 0.1.

Также имейте в виду, что IPv4 или IPv6 как часть домена в электронной почте (например, user@[IPv6:2001:db8::1]) не может быть проверено, только названный хозяева могут.

Узнать больше Вот.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector