0

I am using this function for validating email addresses, but it doesn’t work if the email address is like this:

name@server.com. 
OR 
//name@server.com

Is there a way to develop this function?

function validEmail($email)
{
   $isValid = true;
   $atIndex = strrpos($email, "@");
   if (is_bool($atIndex) && !$atIndex)
   {
      $isValid = false;
   }
   else
   {
      $domain = substr($email, $atIndex+1);
      $local = substr($email, 0, $atIndex);
      $localLen = strlen($local);
      $domainLen = strlen($domain);
      if ($localLen < 1 || $localLen > 64)
      {
         // local part length exceeded
         $isValid = false;
      }
      else if ($domainLen < 1 || $domainLen > 255)
      {
         // domain part length exceeded
         $isValid = false;
      }
      else if ($local[0] == '.' || $local[$localLen-1] == '.')
      {
         // local part starts or ends with '.'
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $local))
      {
         // local part has two consecutive dots
         $isValid = false;
      }
      else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
      {
         // character not valid in domain part
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $domain))
      {
         // domain part has two consecutive dots
         $isValid = false;
      }
      else if
(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
                 str_replace("\\\\","",$local)))
      {
         // character not valid in local part unless 
         // local part is quoted
         if (!preg_match('/^"(\\\\"|[^"])+"$/',
             str_replace("\\\\","",$local)))
         {
            $isValid = false;
         }
      }
      if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A")))
      {
         // domain not found in DNS
         $isValid = false;
      }
   }
   return $isValid;
}
Gumbo
  • 643,351
  • 109
  • 780
  • 844
Utku Dalmaz
  • 9,780
  • 28
  • 90
  • 130
  • 7
    [How to validate eMails in PHP has been answered countless times before](http://stackoverflow.com/search?q=validate+email+php). [PHP has a native filter function for this](http://de.php.net/manual/en/function.filter-var.php). – Gordon Oct 06 '10 at 19:31
  • There are many regular expressions that have been created to validate emails. Just google "email regex" and you will get a number of results. – John Hartsock Oct 06 '10 at 19:35
  • you are right thx thou, i am checking filter function just now thx – Utku Dalmaz Oct 06 '10 at 19:36
  • Your `preg_match` on `$domain` is too restrictive - non-ASCII characters are allowed in domain names, for example `èéê.com` is a valid domain name. I also think the spec does not prohibit an initial or final dot, or consecutive dots, in the local part of the address. – Stephen P Oct 06 '10 at 20:13
  • possible duplicate of [How to check if an email address exists without sending an email?](http://stackoverflow.com/questions/565504/how-to-check-if-an-email-address-exists-without-sending-an-email) – Peter Ajtai Oct 06 '10 at 20:37

3 Answers3

1

Use filter_var(). Below is a simple use demonstration. Many other options are available.

<?php

  // You might want to trim whitespace first: 
$possibleEmailAddress = trim($possibleEmailAddress);

filter_var($possibleEmailAddress, FILTER_VALIDATE_EMAIL);

// Returns false if $possibleEmailAddress doesn't appear valid.
// Returns the email string if it does appear okay.
?>

live example

Note that //name@server.com is a valid email, but name@server.com. is not. You'd have to trim the period from the end to make it valid. You can't just use trim(), since periods at the beginning of an email could be valid and intentional.

Peter Ajtai
  • 56,972
  • 13
  • 121
  • 140
-2
function  checkEmail($email) 
    {
    $patern = '/^[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/';
    if (preg_match($patern , $email)) 
        {
        return TRUE;
        }
    else
        { 
        return FALSE;
        }
    }
}

the simplest

Asar
  • 65
  • 3
-2

Or, same as Asar's but shorter:

function  checkEmail($email) {
     $patern = '/^[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/';
     return preg_match($patern , $email);
}
jorenl
  • 94
  • 5