Как проверить электронную почту в 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 ответов:
можно использовать
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, что привело к обработка выхода онлайн / оффлайн при проверке большое значение. Простой и безопасным обходным путем для этого является использование
strlen()
раньшеfilter_var()
. Я не уверен насчет 5.3.4 final, но это так написано, что некоторые версии 5.3.4-snapshot также были затронуты.эта ошибка уже исправлена.
обновление 2: этот метод, конечно, проверить
bazmega@kapa
как действительный адрес электронной почты, потому что на самом деле это действительный адрес электронной почты. Но большую часть времени в интернете, вы также хотите, чтобы адрес электронной почты, чтобы иметь дву:bazmega@kapa.com
. Как предложил в этом блоге (ссылку написал @Istiaque Ahmed), вы можете увеличитьfilter_var()
С регулярное выражение, которое будет проверять наличие точки в доменной части (не будет проверять действительный TLD хотя):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-совместимое регулярное выражение синтаксис, это часто более быстрая альтернатива с ereg().
Это старый пост, но я поделюсь одним своим решением, потому что никто не упоминает здесь одну проблему раньше.
новый адрес электронной почты может содержать символы UTF-8 или специальные доменные имена, как
.live
,.news
etc.также я нахожу, что какой-то адрес электронной почты может быть на кириллице и во всех случаях стандартное регулярное выражение или
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