Как я могу проверить, что вводимое значение является действительным адресом электронной почты, используя 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." не является действительным адресом электронной почты ";
}
?>.
Web