Как я могу проверить, что вводимое значение является действительным адресом электронной почты, используя php5? Сейчас я использую следующий код:
function isValidEmail($email) {
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z] { 2,3 } )$";
if (eregi($pattern, $email)) {
return true;
} else {
return false;
}
} ,
но он показывает ошибку deprecated. Как я могу исправить эту проблему? Пожалуйста, помогите мне.
Ответ 1
Вы можете использовать эту функцию filter_var(), которая дает вам множество удобных опций проверки и очистки.
filter_var($email, FILTER_VALIDATE_EMAIL)
-
Руководство PHP filter_var()
-
Доступно в PHP> = 5.2.0
Если вы не хотите изменять свой код, основанный на вашей функции, просто выполните:
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
Примечание . Для других целей (где вам нужен Regex) при использовании устаревшего семейства ereg функций (POSIX Regex Functions) следует заменить семейством preg ( PCRE Regex Functions). Есть небольшое количество отличий, достаточно прочитать Инструкцию.
Дополнение 1:
В PHP 5.3.3 и 5.2.14 была ошибка, связанная с FILTER_VALIDATE_EMAIL, которая приводила к segfault при проверке больших значений. Простой и безопасный способ решения этой проблемы – использовать strlen() перед вызовом filter_var(). Я не уверен насчет версии 5.3.4 final, но написано, что некоторые версии моментальных снимков 5.3.4 также были затронуты.
Эта ошибка уже исправлена.
Дополнение 2 : Этот метод, конечно, подтвердит bazmega@kapa как действительный адрес электронной почты, потому что на самом деле это действительный адрес электронной почты. Но чаще всего в Интернете вы также хотите, чтобы адрес электронной почты имел TLD: bazmega@kapa.com. Вы можете дополнить filter_var() регексом, который будет проверять наличие точки в доменной части (но не будет проверять наличие действительного TLD):
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL)
&& preg_match('/@.+\./', $email);
} .
Ответ 2
Я хочу поделиться своим решением, потому что никто не упоминал об этой проблеме раньше.
Новый адрес электронной почты может содержать символы UTF-8 или специальные доменные имена, такие как .live, .news и т.д. Также я обнаружил, что некоторые email адреса могут быть на кириллице и во всех случаях стандартный regex или filter_var() не работают.
Поэтому я создал решение для этого:
function valid_email($email) {
if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
return false;
else {
$email=trim(strtolower($email));
if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
else {
$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';
return (preg_match($pattern, $email) === 1) ? $email : false;
}
}
} .
Эта функция отлично работает для всех случаев и форматов электронной почты.
Ответ 3
Я всегда использую это:
function validEmail($email) {
// Сначала мы проверяем, что есть один символ @, и что длины правильные
if (!preg_match("/^[^@] { 1,64 } @[^@] { 1,255 } $/", $email)) {
// Письмо недействительно, потому что в одном разделе неверное количество символов или неверное количество символов @.
return false;
}
// Разделите его на разделы, чтобы облегчить код
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_' { | } ~-][A-Za-z0-9!#$%&'*+\/=?^_' { | } ~\.-] { 0,63 } )|(\"[^(\\|\")] { 0,62 } \"))$/", $local_array[$i])) {
return false;
}
}
if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Проверьте, является ли домен IP. Если нет, то это должно быть действительное доменное имя
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Недостаточно частей для домена
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-] { 0,61 } [A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
return false;
}
}
}
return true;
} .
Ответ 4
Пользовательские данные очень важны для хорошего разработчика, поэтому не запрашивайте снова и снова одни и те же данные, используйте некоторую логику, чтобы исправить некоторые базовые ошибки в данных.
Перед проверкой адреса электронной почты: сначала удалите из электронной почты все недопустимые символы.
//Это удалит все недопустимые символы из адреса письма
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
после этого подтвердите свой адрес электронной почты с помощью этой функции filter_var().
filter_var($email, FILTER_VALIDATE_EMAIL)) // Чтобы подтвердить электронную почту
Например,
<?php
$email = "john.doe@example.com";
// Удалите все недопустимые символы из письма
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// Проверка электронной почты
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo $email."действительный адрес электронной почты";
} else {
echo $email." не является действительным адресом электронной почты ";
}
?>.