WordPress Version: 6.3
/**
* Verifies that an email is valid.
*
* Does not grok i18n domains. Not RFC compliant.
*
* @since 0.71
*
* @param string $email Email address to verify.
* @param bool $deprecated Deprecated.
* @return string|false Valid email address on success, false on failure.
*/
function is_email($email, $deprecated = false)
{
if (!empty($deprecated)) {
_deprecated_argument(__FUNCTION__, '3.0.0');
}
// Test for the minimum length the email can be.
if (strlen($email) < 6) {
/**
* Filters whether an email address is valid.
*
* This filter is evaluated under several different contexts, such as 'email_too_short',
* 'email_no_at', 'local_invalid_chars', 'domain_period_sequence', 'domain_period_limits',
* 'domain_no_periods', 'sub_hyphen_limits', 'sub_invalid_chars', or no specific context.
*
* @since 2.8.0
*
* @param string|false $is_email The email address if successfully passed the is_email() checks, false otherwise.
* @param string $email The email address being checked.
* @param string $context Context under which the email was tested.
*/
return apply_filters('is_email', false, $email, 'email_too_short');
}
// Test for an @ character after the first position.
if (strpos($email, '@', 1) === false) {
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', false, $email, 'email_no_at');
}
// Split out the local and domain parts.
list($local, $domain) = explode('@', $email, 2);
/*
* LOCAL PART
* Test for invalid characters.
*/
if (!preg_match('/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local)) {
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', false, $email, 'local_invalid_chars');
}
/*
* DOMAIN PART
* Test for sequences of periods.
*/
if (preg_match('/\.{2,}/', $domain)) {
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', false, $email, 'domain_period_sequence');
}
// Test for leading and trailing periods and whitespace.
if (trim($domain, " \t\n\r\x00\v.") !== $domain) {
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', false, $email, 'domain_period_limits');
}
// Split the domain into subs.
$subs = explode('.', $domain);
// Assume the domain will have at least two subs.
if (2 > count($subs)) {
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', false, $email, 'domain_no_periods');
}
// Loop through each sub.
foreach ($subs as $sub) {
// Test for leading and trailing hyphens and whitespace.
if (trim($sub, " \t\n\r\x00\v-") !== $sub) {
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', false, $email, 'sub_hyphen_limits');
}
// Test for invalid characters.
if (!preg_match('/^[a-z0-9-]+$/i', $sub)) {
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', false, $email, 'sub_invalid_chars');
}
}
// Congratulations, your email made it!
/** This filter is documented in wp-includes/formatting.php */
return apply_filters('is_email', $email, $email, null);
}