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,}$/i
If 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 ...
Get PHP Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.