How to validate an Email in PHP?

email-validation, php, regex, validation

Solution

You can use the `filter_var()` function, which gives you a lot of handy validation and sanitization options.

filter_var($email, FILTER_VALIDATE_EMAIL)

PHP Manual filter_var()

Available in PHP >= 5.2.0

If you don't want to change your code that relied on your function, just do:

function isValidEmail($email){ 
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

Note: For other uses (where you need Regex), the deprecated `ereg` function family (POSIX Regex Functions) should be replaced by the `preg` family (PCRE Regex Functions). There are a small amount of differences, reading the Manual should suffice.

Update 1: As pointed out by @binaryLV:

PHP 5.3.3 and 5.2.14 had a bug related to FILTER_VALIDATE_EMAIL, which resulted in segfault when validating large values. Simple and safe workaround for this is using `strlen()` before `filter_var()`. I'm not sure about 5.3.4 final, but it is written that some 5.3.4-snapshot versions also were affected.

This bug has already been fixed.

Update 2: This method will of course validate `bazmega@kapa` as a valid email address, because in fact it is a valid email address. But most of the time on the Internet, you also want the email address to have a TLD: `bazmega@kapa.com`. As suggested in this blog post (link posted by @Istiaque Ahmed), you can augment `filter_var()` with a regex that will check for the existence of a dot in the domain part (will not check for a valid TLD though):

function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) 
        && preg_match('/@.+\./', $email);
}

As @Eliseo Ocampos pointed out, this problem only exists before PHP 5.3, in that version they changed the regex and now it does this check, so you do not have to.

Problem

How can I validate the input value is a valid email address using php5. Now I am using this code ``` function isValidEmail($email){ $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"; if (eregi($pattern, $email)){ return true; } else { return false; } } ``` but it shows deprecated error. How can I fix this issue. Please help me.

Original source

Related problems