Как проверить электронную почту на PHP?
Как я могу подтвердить, что входное значение является действительным адресом электронной почты с помощью 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;
}
}
Но это показывает устаревшую ошибку. Как я могу исправить эту проблему. Пожалуйста, помогите мне.
5 answers
Вы можете использовать функцию filter_var()
, которая предоставляет вам множество удобных вариантов проверки и очистки.
filter_var($email, FILTER_VALIDATE_EMAIL)
Доступно в PHP >= 5.2.0
Если вы не хотите изменять свой код, который зависел от вашей функции, просто сделайте:
function isValidEmail($email){
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
Примечание: Для других применений (где вам нужно регулярное выражение), устаревшее семейство функций ereg
(функции регулярного выражения POSIX) должно быть заменено семейством preg
( Функции регулярных выражений PCRE ). Есть небольшое количество различий, чтения Руководства должно быть достаточно.
Обновление 1: Как указано @binarylv:
В 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: [email protected]
. Как предлагается в этом сообщении в блоге (ссылка опубликована @Istiaque Ahmed), вы можете дополнить filter_var()
регулярным выражением, которое будет проверять наличие наличие точки в части домена (не будет проверять наличие действительного ДВУ, хотя):
function isValidEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL)
&& preg_match('/@.+\./', $email);
}
Как @Eliseo Ocampos указал, эта проблема существовала только до PHP 5.3, в этой версии они изменили регулярное выражение, и теперь он выполняет эту проверку, так что вам не нужно.
Смотрите примечания по адресу http://www.php.net/manual/en/function.ereg.php:
Note:
Начиная с PHP 5.3.0, расширение регулярного выражения устарело в пользу расширения PCRE. Вызов этой функции приведет к появлению E_DEPRECATED уведомление. Смотрите список различий за помощью по преобразованию в PCRE.
Note:
Preg_match(), который использует синтаксис регулярных выражений, совместимый с Perl , часто является более быстрой альтернативой эрег().
Это старый пост, но я поделюсь одним своим решением, потому что никто раньше не упоминал здесь об одной проблеме.
Новый адрес электронной почты может содержать символы UTF-8 или специальные доменные имена, такие как .live
, .news
и т.д.
Также я нахожу, что какой-то адрес электронной почты может быть на кириллице, и во всех случаях стандартное регулярное выражение или 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;
}
}
}
Эта функция отлично работает для всех случаев и форматов электронной почты.
Я всегда использую это:
function validEmail($email){
// First, we check that there's one @ symbol, and that the lengths are right
if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// Split it into sections to make life easier
$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])) { // Check if domain is IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
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;
}
Держитесь подальше от regex
и filter_var()
решений для проверки электронной почты. Смотрите этот ответ: https://stackoverflow.com/a/42037557/953833