Проверка адреса электронной почты PHP

Для PHP наилучшая проверка электронной почты с использованием preg, НЕ ereg, потому что она устарела / удалена < / сильный>.

Мне не нужно проверять, существует ли веб-сайт (это не похоже на максимальную безопасность).

Я нашел много способов с ereg, но они (очевидно) не являются хорошей практикой.


person Mark Lalor    schedule 31.08.2010    source источник


Ответы (3)


Предлагаю вам использовать фильтр FILTER_VALIDATE_EMAIL:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    //valid
}

Вы также можете использовать его регулярное выражение напрямую:

"/^(?!(?:(?:\\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"

Но в этом случае, если в регулярном выражении будет обнаружена ошибка, вам придется обновить свою программу, а не просто обновить PHP.

person Artefacto    schedule 31.08.2010
comment
Имейте в виду, что электронное письмо также может содержать следующие символы: '/ * `. Таким образом, эта проверка не делает БД безопасной. - person Jan.; 01.09.2010
comment
filter_var () для меня в новинку. FILTER_VALIDATE_EMAIL - это хорошо? - person Marwelln; 01.09.2010
comment
+1 для ссылки на исходный код. отличный - person Michel Gokan Khan; 29.10.2012
comment
Ссылка на исходный код мертва. Последняя ссылка находится здесь. Регулярное выражение также изменилось. - person Pang; 24.06.2015

Если вы не хотите использовать очень длинные регулярные выражения, вы встретятся действительные адреса электронной почты, которые не охвачены (например, Unicode). Также поддельные адреса электронной почты будут считаться действительными, так какой смысл проверки, если вы можете просто написать [email protected] и уйти с рук?

Лучший способ подтвердить адреса электронной почты - отправить электронное письмо с подтверждением со ссылкой, по которой нужно щелкнуть. Это будет работать только в том случае, если адрес электронной почты действителен: просто и не нужно использовать регулярное выражение.

person nico    schedule 31.08.2010
comment
просто, как я уже сказал, это не похоже на максимальную безопасность - person Mark Lalor; 01.09.2010
comment
Разумный Разработчик всегда будет проверять данный адрес на достоверность ПЕРЕД попыткой отправить электронное письмо в строку. Так что это не аргумент. Но Doupble-opt-in все равно должен быть выполнен - ​​вопрос не в этом. - person Jan.; 01.09.2010
comment
@Jan .: Итак, что, если мой адрес электронной почты àèìòù@mydomain.com и ваша превентивная проверка не позволяет мне зарегистрироваться на вашем сайте? Просто отправьте электронное письмо с подтверждением, и все готово, нет необходимости проверять действительность раньше и рисковать заблокировать действующие адреса электронной почты. - person nico; 01.09.2010
comment
@nico: Ваш пример не соответствует RFC2821 и RFC2822. Оба четко заявляют, что разрешены только 7-битные символы ASCII .. и даже не любые из них. Я лучше отброшу такой неправильный адрес, чем позволю спамеру злоупотреблять сервером с помощью каких-то магических инъекций заголовков. Кроме того, в Википедии говорится следующее относительно интернационализации локальной части: когда EAI стандартизирован, пользователи, скорее всего, будут иметь локализованный адрес в сценарии или наборе символов на родном языке, а также в форме ASCII для связи с устаревшими системами или для независимых от сценариев. использовать ... С уважением. - person Jan.; 01.09.2010
comment
продолжение: RFC о международных адресах электронной почты, скорее всего, будут изменены, прежде чем они станут новым стандартом. Так что нет смысла внедрять эту незавершенную работу .. ИМХО. - person Jan.; 01.09.2010
comment
@Jan .: вы упускаете мою точку зрения. Предварительная проверка электронной почты не дает никаких дополнительных преимуществ ни вам, ни пользователю. Вы не можете сказать, настоящий ли адрес электронной почты, просто если он правильно сформирован (так что он не защищает вас от спама вообще), и у пользователя есть (очень небольшой, но все же присутствующий) шанс получить легитимное письмо. адрес отклонен, если ваше регулярное выражение не является исчерпывающим (см. ссылку в моем ответе). - person nico; 01.09.2010
comment
прочтите, пожалуйста, о добавлении заголовков в электронную почту, чтобы понять, о чем я говорю. - person Jan.; 02.09.2010
comment
Извините ... как проверка электронной почты regexp вообще предотвратит инъекцию заголовка? - person nico; 02.09.2010

function check_email($check) {
$expression = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/";
if (preg_match($expression, $check)) {
    return true;
} else {
    return false;
} 
}

Вызовите его в условии if (), как показано ниже:

if(!check_email($_REQUEST['ContactEmail'])){
  $register_error ="Enter the correct email address!<br />";
  $reg_error=1; 
}
person Gaurav Gupta    schedule 14.05.2013
comment
может ли кто-нибудь сказать мне, в чем проблема в этом коде bcz человека, проигравшего голосование. Работает нормально. - person Gaurav Gupta; 29.05.2015
comment
Это не я голосовал против, но .... это неправильно для правильной фильтрации адресов электронной почты, правильное и полное регулярное выражение можно найти здесь: ex-parrot.com/~pdw/Mail-RFC822-Address.html Во-вторых, использование PHP, встроенного в FILTER_VALIDATE_EMAIL, будет правильный / лучший способ отфильтровать адрес электронной почты - person twigg; 30.06.2016