is_email

The timeline below displays how wordpress function is_email has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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

WordPress Version: 5.4

/**
 * 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);
}

WordPress Version: 5.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);
}

WordPress Version: 4.8

/**
 * 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|bool Either false or the valid email address.
 */
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 bool   $is_email Whether the email address has passed the is_email() checks. Default false.
         * @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);
}

WordPress Version: 4.6

/**
 * 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|bool Either false or the valid email address.
 */
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) < 3) {
        /**
         * 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 bool   $is_email Whether the email address has passed the is_email() checks. Default false.
         * @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);
}

WordPress Version: 4.4

/**
 * 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|bool Either false or the valid email address.
 */
function is_email($email, $deprecated = false)
{
    if (!empty($deprecated)) {
        _deprecated_argument(__FUNCTION__, '3.0');
    }
    // Test for the minimum length the email can be
    if (strlen($email) < 3) {
        /**
         * Filter 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 bool   $is_email Whether the email address has passed the is_email() checks. Default false.
         * @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);
}

WordPress Version: 4.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|bool Either false or the valid email address.
 */
function is_email($email, $deprecated = false)
{
    if (!empty($deprecated)) {
        _deprecated_argument(__FUNCTION__, '3.0');
    }
    // Test for the minimum length the email can be
    if (strlen($email) < 3) {
        /**
         * Filter 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 bool   $is_email Whether the email address has passed the is_email() checks. Default false.
         * @param string $email    The email address being checked.
         * @param string $message  An explanatory message to the user.
         * @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);
}

WordPress Version: 3.8

/**
 * 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 boolean $deprecated Deprecated.
 * @return string|bool Either false or the valid email address.
 */
function is_email($email, $deprecated = false)
{
    if (!empty($deprecated)) {
        _deprecated_argument(__FUNCTION__, '3.0');
    }
    // Test for the minimum length the email can be
    if (strlen($email) < 3) {
        /**
         * Filter 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 bool   $is_email Whether the email address has passed the is_email() checks. Default false.
         * @param string $email    The email address being checked.
         * @param string $message  An explanatory message to the user.
         * @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);
}

WordPress Version: 3.7

/**
 * 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 boolean $deprecated Deprecated.
 * @return string|bool Either false or the valid email address.
 */
function is_email($email, $deprecated = false)
{
    if (!empty($deprecated)) {
        _deprecated_argument(__FUNCTION__, '3.0');
    }
    // Test for the minimum length the email can be
    if (strlen($email) < 3) {
        return apply_filters('is_email', false, $email, 'email_too_short');
    }
    // Test for an @ character after the first position
    if (strpos($email, '@', 1) === false) {
        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)) {
        return apply_filters('is_email', false, $email, 'local_invalid_chars');
    }
    // DOMAIN PART
    // Test for sequences of periods
    if (preg_match('/\.{2,}/', $domain)) {
        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) {
        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)) {
        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) {
            return apply_filters('is_email', false, $email, 'sub_hyphen_limits');
        }
        // Test for invalid characters
        if (!preg_match('/^[a-z0-9-]+$/i', $sub)) {
            return apply_filters('is_email', false, $email, 'sub_invalid_chars');
        }
    }
    // Congratulations your email made it!
    return apply_filters('is_email', $email, $email, null);
}