PHP Проверяйте домен зарегистрированной электронной почты как адрес «school.edu»

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

Допустим, школьный сайт: school.edu.

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

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

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

Конечно, есть несколько способов проверить, вот что я придумал с головы:

 $email = $_POST['email']; $allowed = array('school.edu', 'school2.edu', 'school3.edu'); // Make sure the address is valid if (filter_var($email, FILTER_VALIDATE_EMAIL)) { $explodedEmail = explode('@', $email); $domain = array_pop($explodedEmail); if ( ! in_array($domain, $allowed)) { // Not allowed } } 

explode() разделяет строку на @ символов (должно быть только одно в любом случае, поэтому возможно, что substr() будет немного более эффективным), а array_pop() удаляет и возвращает последний, который должен быть всем после @ и быть домен электронной почты.

Там может быть намного лучший или более сжатый метод, но это должно работать независимо.

Обратите внимание, что просто получение всего после того, как @ может не выполнить то, что вы пытаетесь выполнить, из-за адресов электронной почты, таких как 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"; } 

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

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

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

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

  $acceptedDomains = array('site1.edu', 'site2.edu'); if(in_array(substr($email, strrpos($email, '@') + 1), $acceptedDomains)) { // Email is from a domain in $acceptedDomains } 

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

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

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

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

  list($name, $domain) = explode('@', $email); 

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

 $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! }