Как проверить адрес электронной почты в 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;
}
}
но это показывает устаревшую ошибку. Как я могу исправить эту проблему. Пожалуйста, помогите мне.
9 ответов
Вы можете использовать filter_var()
функция, которая дает вам множество удобных опций проверки и очистки.
filter_var($email, FILTER_VALIDATE_EMAIL)
Доступно в 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: как указано @binaryLV:
В PHP 5.3.3 и 5.2.14 была ошибка, связанная с FILTER_VALIDATE_EMAIL, что приводило к segfault при проверке больших значений. Простой и безопасный обходной путь для этого - использование
strlen()
доfilter_var()
, Я не уверен насчет финальной версии 5.3.4, но написано, что некоторые версии 5.3.4 также были затронуты.
Эта ошибка уже исправлена.
Обновление 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 расширение regex устарело в пользу расширения PCRE. Вызов этой функции выдаст уведомление E_DEPRECATED. См. Список различий для получения справки по конвертации в PCRE.
Note:
preg_match (), использующий Perl-совместимый синтаксис регулярных выражений, часто является более быстрой альтернативой ereg().
Это старый пост, но я поделюсь одним моим решением, потому что никто не упомянул здесь одну проблему раньше.
Новый адрес электронной почты может содержать символы 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;
}
}
}
Эта функция отлично работает для всех случаев и форматов электронной почты.
Пользовательские данные очень важны для хорошего разработчика, поэтому не запрашивайте снова и снова одни и те же данные, используйте некоторую логику для исправления некоторых основных ошибок в данных.
Перед проверкой адреса электронной почты: сначала удалите из электронной почты все недопустимые символы.
//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
после этого подтвердите свой адрес электронной почты, используя этот filter_var()
функция.
filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email
Например,
<?php
$email = "john.doe@example.com";
// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// Validate email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo $email." is a valid email address";
} else {
echo $email." is not a valid email address";
}
?>
Я всегда использую это:
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;
}
Использование:
- или "filter_var" с http://php.net/manual/en/function.filter-var.php
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
- или "EmailValidator" с https://github.com/egulias/EmailValidator
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
new RFCValidation(),
new DNSCheckValidation()
]);
$validator->isValid("example@example.com", $multipleValidations); //true
Держись подальше от regex
а также filter_var()
решения для проверки электронной почты. Смотрите этот ответ: /questions/12545298/kak-proverit-adres-elektronnoj-pochtyi-v-php/12545317#12545317
Хотя я немного опоздал, это может помочь тому, кто все еще хочет проверить больше.
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid email address
}
Это будет проверять только правильность формата электронной почты или нет. Но если вы хотите использовать больше, например, существует ли этот адрес электронной почты на самом деле или нет, вы можете использовать бесплатный API.
Вот код, который я сейчас использую на своем сайте.
if(isEmialExist("EMAIL_ADDRESS_THAT"))
{
echo "email exists, real email";
}
else
{
echo "email doesn't exist";
}
function isEmialExist($emailAddress)
{
if (!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
return false; //invalid format
}
//now check if email really exist
$postdata = http_build_query(array('api_key' => 'YOUR_API_KEY', 'email' => $emailAddress ));
$url = "https://email-validator.com/api/v1.0/json";
$opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => $postdata ));
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);
$data = json_decode($result, false);
return $data->is_exists;
}
Более подробную информацию вы можете найти здесь.https://email-validator.com/tutorial
Преимущество этого API в том, что он предоставляет результаты в режиме реального времени, и вы получите 10000 бесплатных кредитов.
будьте осторожны, адрес как [email protected] является НЕДЕЙСТВИТЕЛЬНЫМ, но filter_var() возвращает true, многие другие строки (электронные письма) INVALIDS возвращают true, используя filter_var().
для проверки электронной почты я использую эту функцию:
function correcorre($s){// correo correcto
$x = '^([[:alnum:]](_|-|\.)*)*[[:alnum:]]+@([[:alnum:]]+(-|\.)+)*[[:alnum:]]+\.[[:alnum:]]+$';
preg_match("!$x!i", $s, $M);
if(!empty($M[0]))return($M[0]);
}
пожалуйста, улучшите и поделитесь, спасибо