Лучшая функция проверки электронной почты в целом и в конкретном случае (домен колледжа)?

Я знаю, что проверка адреса электронной почты - одна из тех вещей, которые не являются самыми забавными. Я запускаю веб-сайт и хочу ограничить свою аудиторию только людьми из моего колледжа, а также мне нужен предпочтительный адрес электронной почты для моего пользователя. Итак, это вопрос, состоящий из двух частей.

  1. Есть ли действительно надежная функция php для проверки электронной почты?

  2. Могу ли я подтвердить электронную почту из определенного домена. Я не хочу просто проверять, существует ли домен, потому что я знаю, что www.mycollege.edu уже существует. Есть ли какой-либо способ проверить, что у пользователя есть действующий веб-адрес @ mycollege.edu?


person Ben    schedule 03.06.2011    source источник
comment
возможный дубликат того, что станет каноническим ответом на этот вопрос (охватывает обе части): Есть ли библиотека php для проверки адресов электронной почты?   -  person Dan J    schedule 04.06.2011
comment
Отвечает ли это на ваш вопрос? Есть ли библиотека php для проверки адреса электронной почты?   -  person peterh    schedule 04.11.2020


Ответы (7)


Вот что я использую:

   function check_email_address($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;
    }

EDIT заменен устаревший ereg на preg_match для совместимости с PHP 5.3.

person Chris Baker    schedule 03.06.2011
comment
Да :( OP не указал php 5.3. Мне все еще нужно перенести эту функцию в preg_match (что тривиально). Тем не менее, она все еще работает. - person Chris Baker; 04.06.2011
comment
:) Все, что вам нужно сделать, это просто добавить разделители и изменить имя. - person Jimithus; 04.06.2011
comment
О, я понимаю ... заставьте меня сделать это сейчас. Я вижу, куда дует ветер. :П - person Chris Baker; 04.06.2011
comment
@Chris, почему бы php5 не встроить проверку электронной почты: return filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match('/@.+\./', $email);. Перед финальным тестированием адрес электронной почты следует обрезать. Также необходимо целочисленное преобразование возвращаемого значения. Его можно найти здесь: electrictoolbox.com/php-email-validation-filter-var-updated. - person Istiaque Ahmed; 21.11.2012
comment
@IstiaqueAhmed на момент написания я чувствовал, что этот строго регулярный подход был лучшим для случаев использования, с которыми я сталкивался. Это, конечно, очень субъективное мнение. filter_var работает и использует гораздо более сложный набор регулярных выражений, чем этот. Нет особой причины не использовать его, я просто предпочитаю этот подход, потому что он надежен для меня. Фрэнки, я удивлен, что он принял ответ, так как я не полностью ответил на его вопрос: D - person Chris Baker; 21.11.2012
comment
@Chris, у меня сложилось неверное впечатление. Целочисленное приведение необходимо только для повторения. - person Istiaque Ahmed; 22.11.2012

Если вы действительно хотите убедиться, что он действителен, сделайте свою форму регистрации, отправьте им электронное письмо с URL-ссылкой, в которой они должны щелкнуть, чтобы подтвердить.

Таким образом, вы не только знаете, что адрес действителен (потому что вы получили электронное письмо), но также знаете, что владелец учетной записи зарегистрировался (если кто-то еще не знает его данные для входа).

Чтобы убедиться, что он заканчивается правильно, вы можете использовать explode () для '@' и проверить вторую часть.

$arr = explode('@', $email_address);
if ($arr[1] == 'mycollege.edu')
{
    // Then it's from your college
}

В PHP также есть собственный способ проверки адресов электронной почты с помощью filter_var: http://www.w3schools.com/php/filter_validate_email.asp

person diggersworld    schedule 03.06.2011
comment
w3schools не является надежным источником информации. Вместо этого серьезно используйте собственную документацию PHP. php.net/manual/en/ref.filter.php Почему доверять какому-либо веб-сайту, когда можно получить прекрасно полную документацию прямо из источника? - person Chris Baker; 04.06.2011
comment
Справедливый вопрос об использовании сайта PHP в отличие от w3schools. Это было первое, что возникло, когда я погуглил по электронной почте filter_var. Будем вспоминать в будущем. - person diggersworld; 04.06.2011
comment
w3schools тратит много денег, чтобы добиться лучших результатов. Они также отравляют Интернет ошибочной документацией по ASP, VB, C и javascript (среди прочего). У них нет авторитета или доверия. Для Javascript поместите MDC перед поисковым запросом Google, и вы получите Mozilla Dev Center. Для php поместите php.net перед термином, чтобы каждый раз получать официальную документацию. :) - person Chris Baker; 04.06.2011
comment
Я, вероятно, в конечном итоге отправлю проверочный адрес электронной почты. Хорошая идея - person Ben; 04.06.2011

Это должно работать:

if (preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])@mycollege.edu$/', $email)) {
     // Valid
}
person gpresland    schedule 03.06.2011

Прочтите здесь http://ru2.php.net/manual/en/book.filter.php

Или короче

var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));
person azat    schedule 03.06.2011
comment
Это также подтвердит, что адреса, отличные от @ mycollege.edu, также являются ИСТИННЫМИ. - person gpresland; 04.06.2011
comment
Для меня это правильно! php -r "var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));" (PHP 5.3.3-7) - person azat; 04.06.2011
comment
Ему нужны только адреса в @ mycollege.edu для проверки. Все остальное должно потерпеть неудачу. - person gpresland; 04.06.2011

это могло бы быть лучшим решением. многие уже ответили, хотя это немного отличается.

$email = "[email protected]";

if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
 echo $email ." is a valid email address";
} else {
  echo $email ." is not a valid email address";
}

Я надеюсь, что этим легко пользоваться.

person Community    schedule 08.09.2015

для любой электронной почты

([a-zA-Z0-9_-]+)(\@)([a-zA-Z0-9_-]+)(\.)([a-zA-Z0-9]{2,4})(\.[a-zA-Z0-9]{2,4})?

для функции php preg_match

/([a-zA-Z0-9_-]+)(\@)([a-zA-Z0-9_-]+)(\.)([a-zA-Z0-9]{2,4})(\.[a-zA-Z0-9]{2,4})?/i

для @ mycollege.edu

^([a-zA-Z0-9_-]+)(@mycollege.edu)$

для функции php preg_match

/^([a-zA-Z0-9_-]+)(@mycollege.edu)$/i

КОД PHP

<?php 

$email = '[email protected]';
preg_match('/^([a-zA-Z0-9_-]+)(@mycollege.edu)$/i', $email, $matches);

if ($matches) { 
    echo "Matched";
} else {
    echo "Not Matched";
}

var_dump($matches);
person Community    schedule 12.08.2012

Простая функция с использованием filter_var в php

<?php
function email_validation($email) {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
       echo("$email is a valid email address");
    } else {
       echo("$email is not a valid email address");
    }
}

//Test
email_validation('johnson123');
?>
person thelightings    schedule 21.08.2016