PHP Проверить домен регистрируемой электронной почты является адресом «school.edu» - PullRequest
15 голосов
/ 02 августа 2011

Мне нужно написать функцию для проекта, над которым я работаю, для развлечения, где мы делаем сайт доступным только для студентов, сотрудников и выпускников в учреждении.

Скажем, школывеб-сайт: school.edu.

У меня проблемы с написанием php-фильтра, который проверяет наличие у отправленного адреса электронной почты домена "school.edu"

. Я буду использовать пример,У чувака № 1 есть электронная почта user@mail.com, а у чувака № 2 - электронная почта user@school.edu.Я хочу убедиться, что Dude 1 получает сообщение об ошибке, а Dude # 2 успешно зарегистрирован.

Это суть того, что я пытаюсь сделать.В ближайшее время сайт разрешит регистрацию еще в двух региональных школах: school2.edu и school3.edu.Затем мне понадобится средство проверки, чтобы проверить электронную почту по небольшому списку (может быть, массиву?) Доменов, чтобы убедиться, что электронная почта соответствует доменному имени в списке.

Ответы [ 6 ]

33 голосов
/ 02 августа 2011

Есть несколько способов сделать это, вот один:

// Make sure we have input
// Remove extra white space if we do
$email = isset($_POST['email']) ? trim($_POST['email']) : null;

// List of allowed domains
$allowed = [
    'school.edu',
    'school2.edu',
    'school3.edu'
];

// Make sure the address is valid
if (filter_var($email, FILTER_VALIDATE_EMAIL))
{
    // Separate string by @ characters (there should be only one)
    $parts = explode('@', $email);

    // Remove and return the last part, which should be the domain
    $domain = array_pop($parts);

    // Check if the domain is in our list
    if ( ! in_array($domain, $allowed))
    {
        // Not allowed
    }
}
7 голосов
/ 02 августа 2011

Вы можете использовать регулярное выражение:

if(preg_match('/^\w+@school\.edu$/i', $source_string) > 0)
    //valid

Теперь продолжайте разрывать меня на части в комментариях, потому что есть какая-то сумасшедшая функция адреса электронной почты, которую я не учел :)

5 голосов
/ 11 сентября 2012

Обратите внимание, что получение всего после @ может не выполнить то, что вы пытаетесь выполнить из-за адресов электронной почты, таких как user@students.ecu.edu. Приведенная ниже функция get_domain приведет к переносу домена только на домен второго уровня. Он вернет "unc.edu" для username@unc.edu или username@mail.unc.edu. Кроме того, вы можете использовать домены с кодами стран (которые имеют домены верхнего уровня из 2 символов).

Вы можете использовать функцию ниже для извлечения домена. Затем вы можете использовать массив школьных доменов или поместить школьные домены в базу данных и сравнить адрес электронной почты с этим.

    function get_domain($email)
    {
       if (strrpos($email, '.') == strlen($email) - 3)
          $num_parts = 3;
       else
          $num_parts = 2;

       $domain = implode('.',
            array_slice( preg_split("/(\.|@)/", $email), - $num_parts)
        );

        return strtolower($domain);
    }


    // test the function
    $school_domains = array('unc.edu', 'ecu.edu');

    $email = 'someone@students.ecu.edu';

    if (in_array(get_domain($email), $school_domains))
    {
        echo "good";
    }
3 голосов
/ 28 июля 2016

Простая и одна строка:

     list($name, $domain) = explode('@', $email);
3 голосов
/ 02 августа 2011

Я бы просто сделал это:

 $acceptedDomains = array('site1.edu', 'site2.edu');

 if(in_array(substr($email, strrpos($email, '@') + 1), $acceptedDomains))
 {
    // Email is from a domain in $acceptedDomains
 }

Часть 'what.edu' всегда будет после @.Итак, все, что вам нужно сделать, это:

  1. Найти последнее вхождение @ в строке.(В обычном электронном письме будет только , будет один, но здесь это не имеет значения.)
  2. Получите часть электронного письма после @.Это будет доменное имя.
  3. Используйте in_array() для сравнения доменного имени со списком принятых доменов в $acceptedDomains.

Обратите внимание, что если вы хотите также принятьписьма от email@any.subdomain.site1.edu, вам придется сделать немного больше, но это может или не может быть применимо здесь.Я также предполагаю, что вы проверили, что адреса электронной почты правильно сформированы перед этим.

1 голос
/ 02 августа 2011

Вы всегда можете сделать что-то вроде этого:

$good_domains = array('school.edu'); //in the future, just add to this array for more schools

$email = "user@school.edu"; //your user's email

$matches = array();
preg_match("/^(.+)@([^\(\);:,<>]+\.[a-zA-Z]{2,4})/", $email, &$matches); //validates the email and gathers information about it simultaneously
//should return ['user@mail.com', 'user', 'mail.com']
$domain = $matches[3];

if(in_array($domain, $goood_domains))
{
    //success! your user is from school.edu!
}
else
{
    //oh no! an imposter!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...