Sainath Krishnan
Sainath Krishnan

Reputation: 2139

Domain specific email validation

I am trying to code a registration form where I am validating the email used to sign up.

In a nutshell, I want to ensure that the email ID used to register, is a company domain, and not something like gmail or yahoo.

I have the following code to check IF an email is a part of the given domain, how can I modify this to check that it ISNT in a given list of domains? (eg : gmail.com, yahoo.com,hotmail.com, etc).

return (bool) preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[a-z]{2,4})$/i', $domain);

Im thinking it should be along these lines, but not entirely sure :

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,})(\.[a-z]{2,4})$/i', $value)
{
$error=1;
}
}
if($error==0)
return true;
else
return false;

EDIT : I tried all the answers given here, the form still submits without a problem no matter what domain I use! (Even a non email seems to work!)

This is how I'm calling the function -

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

Problem is, no matter what I do, the user gets redirected to the confirmation page (Even with a name made of numbers and an email like "table".

Upvotes: 0

Views: 4751

Answers (3)

Arnold Daniels
Arnold Daniels

Reputation: 16553

You should do that in a separate step. First check if the e-mailaddress has a valid syntax. Than extract the domain and see if it's not in your blacklist.

function validate($email)
{
  if (!preg_match('/^([a-z0-9\+\_\-\.]+)@([a-z0-9\+\_\-\.]{2,})(\.[a-z]{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);
}

Upvotes: 2

purpletree
purpletree

Reputation: 1943

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

You'll need a pretty big list of domains.

Upvotes: 1

Joaqu&#237;n O
Joaqu&#237;n O

Reputation: 1451

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

Let me know if it's useful.

Upvotes: 1

Related Questions