PHP Проверяйте домен зарегистрированной электронной почты как адрес "school.edu"
Мне нужно написать функцию для проекта, над которым я работаю, для развлечения, где мы делаем сайт доступным только для студентов, сотрудников и выпускников в учреждении.
Скажем, сайт школы: school.edu.
У меня возникли проблемы с написанием php-фильтра, который проверяет, что отправленный адрес электронной почты имеет домен "school.edu"
Я приведу пример. У чувака № 1 есть электронное письмо пользователя@mail.com, а у Dude # 2 есть электронное письмо по адресу [email protected] Я хочу убедиться, что у Dude 1 появляется сообщение об ошибке, а у Dude # 2 есть успешная регистрация.
Это суть того, что я пытаюсь сделать. В ближайшем будущем сайт разрешит регистрацию еще двумя языковыми школами: school2.edu и school3.edu. Затем мне понадобится проверка, чтобы проверить электронную почту на небольшой список (возможно, массив?) Доменов, чтобы убедиться, что адрес электронной почты имеет имя домена в списке.
Ответы
Ответ 1
Есть несколько способов сделать это, вот один:
// 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
}
}
Ответ 2
Вы можете использовать регулярное выражение:
if(preg_match('/^\[email protected]\.edu$/i', $source_string) > 0)
//valid
Теперь продолжайте раздирать меня в комментариях, потому что там какая-то сумасшедшая функция адреса электронной почты, на которую я не учитывал:)
Ответ 3
Обратите внимание, что просто получение всего после того, как @может не выполнить то, что вы пытаетесь выполнить, из-за адресов электронной почты, таких как [email protected] Функция get_domain ниже приведет только к домену до уровня второго уровня. Он вернет "unc.edu" для [email protected] или [email protected] Кроме того, вы можете указать домены с кодами стран (которые имеют домены верхнего уровня из 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 = '[email protected]';
if (in_array(get_domain($email), $school_domains))
{
echo "good";
}
Ответ 4
Я бы просто сделал это:
$acceptedDomains = array('site1.edu', 'site2.edu');
if(in_array(substr($email, strrpos($email, '@') + 1), $acceptedDomains))
{
// Email is from a domain in $acceptedDomains
}
Часть "whatever.edu" всегда будет после @
. Итак, все, что вам нужно сделать, это:
- Найти последнее вхождение
@
в строке. (В обычном электронном письме будет только один, но это не имеет значения здесь.)
- Получите часть сообщения электронной почты после
@
. Это будет имя домена.
- Используйте
in_array()
, чтобы сравнить доменное имя со списком принятых доменов в $acceptedDomains
.
Обратите внимание, что если вы хотите также принимать сообщения от [email protected]
, вам нужно будет сделать немного больше, но это может быть или не быть применимым здесь. Я также предполагаю, что вы подтвердили, что адреса электронной почты хорошо сформированы, прежде чем делать это.
Ответ 5
Простая и единственная строка:
list($name, $domain) = explode('@', $email);
Ответ 6
Вы всегда можете сделать что-то вроде этого:
$good_domains = array('school.edu'); //in the future, just add to this array for more schools
$email = "[email protected]"; //your user email
$matches = array();
preg_match("/^(.+)@([^\(\);:,<>]+\.[a-zA-Z]+)/", $email, &$matches); //validates the email and gathers information about it simultaneously
//should return ['[email protected]', 'user', 'mail.com']
$domain = $matches[3];
if(in_array($domain, $goood_domains))
{
//success! your user is from school.edu!
}
else
{
//oh no! an imposter!
}