Най-добрата функция за валидиране на имейл като цяло и специфично (домейн на колежа)?

Знам, че валидирането на имейл е едно от онези неща, които не са най-смешните в света. Създавам уебсайт и искам да огранича аудиторията си само до хората в моя колеж и също така искам предпочитан имейл адрес за моя потребител. Така че това е въпрос от две части.

  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;
    }

РЕДАКТИРАНЕ Заменен амортизиран 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
О, разбирам... притиска ме да го направя сега. Виждам накъде духа вятърът. :P - person Chris Baker; 04.06.2011
comment
@Крис, защо не 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. Това беше първото нещо, което изникна, когато потърсих в Google 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