13.5. Matching a Valid Email Address
Problem
You want to check if an email address is valid.
Solution
This is a popular question and everyone has a different answer, depending on their definition of valid. If valid means a mailbox belonging to a legitimate user at an existing hostname, the real answer is that you can’t do it correctly, so don’t even bother. However, sometimes a regular expression can help weed out some simple typos and obvious bogus attempts. That said, our favorite pattern that doesn’t require maintenance is:
/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/iIf the IMAP extension is enabled, you can also use
imap_rfc822_parse_adrlist( )
:
$parsed = imap_rfc822_parse_adrlist($email_address, $default_host)
if ('INVALID_ADDRESS' == $parsed['mailbox']) {
// bad address
}Ironically, because this function is so RFC-compliant, it may not give the results you expect.
Discussion
The pattern in the Solution accepts any email address that has a name
of any sequence of characters that isn’t a
@ or whitespace. After the @,
you need at least one domain name consisting of the letters
a-z, the numbers 0-9, and the
hyphen, separated by periods, and proceed it with as many subdomains
you want. Finally, you end with either a two-digit country code or
another top-level domain, such as .com or
.edu.
The solution pattern is handy because it still works if ICANN adds new top-level domains. However, it does allow through a few false positives. This more strict pattern explicitly enumerates the current ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access