Last active
February 12, 2022 15:56
-
-
Save nagiyevelchin/ad0221a03e1c59bab2d50fc4b51fd2d9 to your computer and use it in GitHub Desktop.
Validate an email address in PHP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Validate an email address. | |
* Provide email address (raw input) | |
* Returns 1 if the email address has the email | |
* address format and the domain exists. | |
*/ | |
function validEmail($email) { | |
$isValid = 1; | |
$atIndex = strrpos($email, "@"); | |
if (is_bool($atIndex) && !$atIndex) { | |
$isValid = -1; | |
} 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 = -2; | |
} else { | |
if ($domainLen < 1 || $domainLen > 255) { | |
// domain part length exceeded | |
$isValid = -3; | |
} else { | |
if ($local[0] == '.' || $local[$localLen - 1] == '.') { | |
// local part starts or ends with '.' | |
$isValid = -4; | |
} else { | |
if (preg_match('/\\.\\./', $local)) { | |
// local part has two consecutive dots | |
$isValid = -5; | |
} else { | |
if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) { | |
// character not valid in domain part | |
$isValid = -6; | |
} else { | |
if (preg_match('/\\.\\./', $domain)) { | |
// domain part has two consecutive dots | |
$isValid = -7; | |
} 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 = -8; | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
if (function_exists('checkdnsrr')) { | |
if ($isValid && !(checkdnsrr($domain, "MX") || checkdnsrr($domain, "A"))) { | |
// domain not found in DNS | |
$isValid = -9; | |
} | |
} | |
} | |
return $isValid; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment