Я пытаюсь закодировать регистрационную форму, где я проверяю электронную почту, используемую для регистрации.
Вкратце, я хочу убедиться, что идентификатор электронной почты, используемый для регистрации, является доменом компании, а не что-то вроде gmail или yahoo.
У меня есть следующий код, чтобы проверить, является ли электронное письмо частью данного домена, как я могу изменить это, чтобы проверить, что он ISNT в определенном списке доменов? (например: gmail.com, yahoo.com, hotmail.com и т. д.).
return (bool) preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[az]{2,4})$/i', $domain);
Я думаю, что это должно быть в этом направлении, но не совсем уверенно:
function validate($email) { $error = 0; $domains = array('gmail.com','yahoo.com','hotmail.com'); foreach($domains as $key=>$value) { if(preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[az]{2,4})$/i', $value) { $error=1; } } if($error==0) return true; else return false;
EDIT: Я пробовал все ответы, приведенные здесь, форма по-прежнему представляет без проблем, независимо от того, какой домен я использую! (Даже не электронная почта, похоже, работает!)
Вот как я называю функцию –
if(isset($_POST['clients_register'])) { //Must contain only letters and numbers if(!preg_match('/^[a-zA-Z0-9]$/', $_POST['name'])) { $error[]='The username does not match the requirements'; } //Password validation: must contain at least 1 letter and number. Allows characters !@#$% and be 8-15 characters if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,15}$/', $_POST['password'])) { $error[]='The password does not match the requirements'; } //Email validation if (validateEmail($_POST['email'])==false) { $error[]='Invalid E-mail'; } //Output error in array as each line if ( count($error) > 0) { foreach ($error as $output) { echo "{$output} <br>"; } } else { //Syntax for SQL Insert into table and Redirect user to confirmation page } }
Проблема в том, что независимо от того, что я делаю, пользователь перенаправляется на страницу подтверждения (даже с именем, состоящим из цифр и электронной почты, например «table».
Вы должны сделать это на отдельном шаге. Сначала проверьте правильность синтаксиса e-mailaddress. Затем извлеките домен и посмотрите, не находится ли он в вашем черном списке.
function validate($email) { if (!preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[az]{2,4})$/i', $email)) return false; $domains = array('gmail.com','yahoo.com','hotmail.com'); list(, $email_domain) = explode('@', $email, 2); return !in_array($email_domain, $domains); }
PHP
// Suposing that $email is a valid email function validate($email) { $invalidDomains = array('gmail.com','yahoo.com','hotmail.com'); $parts = explode('@',$email); $domain = $parts[1]; if(!in_array($domain,$invalidDomains)) return true; return false; }
Дайте мне знать, если это полезно.
function validateEmail($email) { // Etc, just an array of the blacklisted domains $blacklistDomains = ['gmail.com', 'yahoo.com', 'hotmail.com', 'googlemail.com']; // Check if the email is valid if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { return false; } // Split the email after the '@' to get the domain $emailParts = explode('@', $email); if (in_array(end($emailParts), $blacklistDomains)) { return false; } return true; }
Вам понадобится довольно большой список доменов.