/    Sign up×
Community /Pin to ProfileBookmark

Email validation (what to avoid)

I hate it when I enter my perfectly valid email address on a website and it tells me it’s invalid. An address like [email protected]. Too many overzealous JavaScript validators flag this as an invalid address, because they don’t like the plus in the local field.

Before you write yet another validator script, please consult these pages for the proper pattern to use:

[url]http://simonslick.com/VEAF/[/url]
[url]http://en.wikibooks.org/wiki/Programming:JavaScript:Standards_and_Best_Practices[/url]

A list of websites and script sources that fail to validate correct addresses (a “hall of shame”) can be found here:

[url]http://mozilla.wikia.com/wiki/User:Me_at_work/plushaters[/url]

to post a comment
JavaScript

9 Comments(s)

Copy linkTweet thisAlerts:
@DokSep 23.2008 — A valid point but criticism looks so much better when one can provide an alternative.

It would be easier for any one reading this message to comply to you request if you would post the single regex which can validate email addresses according to the RFC's. From my experince and from reading about the experience of other programmers it is near impossible to come up with a regex which encompases all the intricate details of the RFC's. But I would certainly welcome such a regex.
Copy linkTweet thisAlerts:
@mrhooSep 23.2008 — Since you never know if an email address is a [I]real [/I]email address, or if it is the email address of the user who typed it in, it generally isn't worth doing a lot of validation.

/.+@.+/.test(emailstring) is quick and simple.

If you need confidence in the address, you can send and receive a confirmation, server side.
Copy linkTweet thisAlerts:
@DokSep 23.2008 — Here is regex for validating RFC822 adresses. This has got to be the longest pattern I've ever seen ?

It is written in Perl so it might not be possible to translate it to JS.
Copy linkTweet thisAlerts:
@SpareSimianauthorSep 23.2008 — My apologies. Somehow the second link was garbled when I posted it. I'll try again. It's also linked from the plushaters page in the 3rd link.

http://en.wikibooks.org/wiki/Programming:JavaScript:Standards_and_Best_Practices

The first two links both provide validation code, including patterns.

Presumably Perl and JavaScript (and PHP, too) share the same underlying regex library, and so should be able to use the same expressions.
Copy linkTweet thisAlerts:
@SpareSimianauthorSep 23.2008 — Drat, the forum corrupted that link again. It's stuffing in HTML tags for bold/unbold before the 2nd colon in the URI.
Copy linkTweet thisAlerts:
@SpareSimianauthorSep 23.2008 — The first two links above have code and patterns to use. The first link was corrupted, but you can find it linked from the plushaters page (the 3rd link).

Perl, JavaScript, and PHP should all share the same underlying regex library, so most expressions should be compatible among all three languages.)
Copy linkTweet thisAlerts:
@DokSep 23.2008 — Perl, JavaScript, and PHP should all share the same underlying regex library, so most expressions should be compatible among all three languages.)[/QUOTE]Regex capabilities in JS ends with forward assertion. No backward assertion, only i, g and m modifiers, no conditionals or any other fancy stuff. PHP and Perl can do far more than JS with regex.
Copy linkTweet thisAlerts:
@opifexSep 24.2008 — this is a little long, but works well


[CODE]/////VALIDATE E-MAIL

function endOption(emailStr,val) {
return emailStr.substring(emailStr.lastIndexOf(val)) == val;
} //tld options //OK

function validate_email(emailStr)
{
apos=emailStr.indexOf("@");
dotpos=emailStr.lastIndexOf(".");

if (apos<1||dotpos-apos<2)
{
return false;
}
if (!endOption(emailStr,'.biz') && !endOption(emailStr,'.com') && !endOption(emailStr,'.edu') && !endOption(emailStr,'.gob') && !endOption(emailStr,'.gov') && !endOption(emailStr,'.info') &&!endOption(emailStr,'.int') &&!endOption(emailStr,'.jobs') &&!endOption(emailStr,'.mil') && !endOption(emailStr,'.mobi') &&!endOption(emailStr,'.museum') && !endOption(emailStr,'.name') && !endOption(emailStr,'.net') && !endOption(emailStr,'.org') &&!endOption(emailStr,'.pro') &&!endOption(emailStr,'.travel') && !endOption(emailStr,'.ac') && !endOption(emailStr,'.ad') && !endOption(emailStr,'.ae') && !endOption(emailStr,'.aero') && !endOption(emailStr,'.af') && !endOption(emailStr,'.ag') && !endOption(emailStr,'.ai') && !endOption(emailStr,'.al') && !endOption(emailStr,'.am') && !endOption(emailStr,'.an') && !endOption(emailStr,'.ao') && !endOption(emailStr,'.aq') && !endOption(emailStr,'.ac') && !endOption(emailStr,'.arpa') && !endOption(emailStr,'.as') && !endOption(emailStr,'.at') && !endOption(emailStr,'.au') && !endOption(emailStr,'.aw') && !endOption(emailStr,'.ax') && !endOption(emailStr,'.az') && !endOption(emailStr,'.ba') && !endOption(emailStr,'.bb') && !endOption(emailStr,'.bd') && !endOption(emailStr,'.be') && !endOption(emailStr,'.bf') && !endOption(emailStr,'.bg') && !endOption(emailStr,'.bh') && !endOption(emailStr,'.bi') && !endOption(emailStr,'.bj') && !endOption(emailStr,'.bm') && !endOption(emailStr,'.bn') && !endOption(emailStr,'.bo') && !endOption(emailStr,'.br') && !endOption(emailStr,'.bs') && !endOption(emailStr,'.bt') && !endOption(emailStr,'.bv') && !endOption(emailStr,'.bw') && !endOption(emailStr,'.by') && !endOption(emailStr,'.bz') && !endOption(emailStr,'.ca') && !endOption(emailStr,'.cat') && !endOption(emailStr,'.cc') && !endOption(emailStr,'.cd') && !endOption(emailStr,'.cf') && !endOption(emailStr,'.cg') && !endOption(emailStr,'.ch') && !endOption(emailStr,'.ci') && !endOption(emailStr,'.ck') && !endOption(emailStr,'.cl') && !endOption(emailStr,'.cm') && !endOption(emailStr,'.cn') && !endOption(emailStr,'.co') && !endOption(emailStr,'.cr') && !endOption(emailStr,'.cu') && !endOption(emailStr,'.cv') && !endOption(emailStr,'.cx') && !endOption(emailStr,'.cy') && !endOption(emailStr,'.cz') && !endOption(emailStr,'.de') && !endOption(emailStr,'.dj') && !endOption(emailStr,'.dk') && !endOption(emailStr,'.dm') && !endOption(emailStr,'.do') && !endOption(emailStr,'.dz') &&!endOption(emailStr,'.ec') &&!endOption(emailStr,'.ee') &&!endOption(emailStr,'.eg') &&!endOption(emailStr,'.er') &&!endOption(emailStr,'.es') &&!endOption(emailStr,'.et') &&!endOption(emailStr,'.eu') &&!endOption(emailStr,'.fi') &&!endOption(emailStr,'.fj') &&!endOption(emailStr,'.fm') &&!endOption(emailStr,'.fo') &&!endOption(emailStr,'.fr') &&!endOption(emailStr,'.ga') &&!endOption(emailStr,'.gb') &&!endOption(emailStr,'.gd') &&!endOption(emailStr,'.ge') &&!endOption(emailStr,'.gf') &&!endOption(emailStr,'.gg') &&!endOption(emailStr,'.gh') &&!endOption(emailStr,'.gi') &&!endOption(emailStr,'.gl') &&!endOption(emailStr,'.gm') &&!endOption(emailStr,'.gn') &&!endOption(emailStr,'.gp') &&!endOption(emailStr,'.gq') &&!endOption(emailStr,'.gr') &&!endOption(emailStr,'.gs') &&!endOption(emailStr,'.gt') &&!endOption(emailStr,'.gu') &&!endOption(emailStr,'.gw') &&!endOption(emailStr,'.gy') &&!endOption(emailStr,'.hk') &&!endOption(emailStr,'.hm') &&!endOption(emailStr,'.hn') &&!endOption(emailStr,'.hr') &&!endOption(emailStr,'.ht') &&!endOption(emailStr,'.hu') &&!endOption(emailStr,'.id') &&!endOption(emailStr,'.ie') &&!endOption(emailStr,'.il') &&!endOption(emailStr,'.im') &&!endOption(emailStr,'.in') &&!endOption(emailStr,'.io') &&!endOption(emailStr,'.iq') &&!endOption(emailStr,'.ir') &&!endOption(emailStr,'.is') &&!endOption(emailStr,'.it') &&!endOption(emailStr,'.je') &&!endOption(emailStr,'.jm') &&!endOption(emailStr,'.jo') &&!endOption(emailStr,'.jp') &&!endOption(emailStr,'.ke') &&!endOption(emailStr,'.kg') &&!endOption(emailStr,'.kh') &&!endOption(emailStr,'.ki') &&!endOption(emailStr,'.km') &&!endOption(emailStr,'.kn') &&!endOption(emailStr,'.kr') &&!endOption(emailStr,'.kw') &&!endOption(emailStr,'.ky') &&!endOption(emailStr,'.kz') &&!endOption(emailStr,'.la') &&!endOption(emailStr,'.lb') &&!endOption(emailStr,'.lc') &&!endOption(emailStr,'.li') &&!endOption(emailStr,'.lk') &&!endOption(emailStr,'.lr') &&!endOption(emailStr,'.ls') &&!endOption(emailStr,'.lt') &&!endOption(emailStr,'.lu') &&!endOption(emailStr,'.lv') &&!endOption(emailStr,'.ly') &&!endOption(emailStr,'.ma') &&!endOption(emailStr,'.mc') &&!endOption(emailStr,'.md') &&!endOption(emailStr,'.mg') &&!endOption(emailStr,'.mh') &&!endOption(emailStr,'.mk') &&!endOption(emailStr,'.ml') &&!endOption(emailStr,'.mm') &&!endOption(emailStr,'.mn') &&!endOption(emailStr,'.mo') &&!endOption(emailStr,'.mp') &&!endOption(emailStr,'.mq') &&!endOption(emailStr,'.mr') &&!endOption(emailStr,'.ms') &&!endOption(emailStr,'.mt') &&!endOption(emailStr,'.mu') &&!endOption(emailStr,'.mv') &&!endOption(emailStr,'.mw') &&!endOption(emailStr,'.mx') &&!endOption(emailStr,'.my') &&!endOption(emailStr,'.mz') &&!endOption(emailStr,'.na') &&!endOption(emailStr,'.nc') &&!endOption(emailStr,'.ne') &&!endOption(emailStr,'.nf') &&!endOption(emailStr,'.ng') &&!endOption(emailStr,'.ni') &&!endOption(emailStr,'.nl') &&!endOption(emailStr,'.no') &&!endOption(emailStr,'.np') &&!endOption(emailStr,'.nr') &&!endOption(emailStr,'.nu') &&!endOption(emailStr,'.nz') &&!endOption(emailStr,'.om') &&!endOption(emailStr,'.pa') &&!endOption(emailStr,'.pe') &&!endOption(emailStr,'.pf') &&!endOption(emailStr,'.pg') &&!endOption(emailStr,'.ph') &&!endOption(emailStr,'.pk') &&!endOption(emailStr,'.pl') &&!endOption(emailStr,'.pm') &&!endOption(emailStr,'.pn') &&!endOption(emailStr,'.pr') &&!endOption(emailStr,'.ps') &&!endOption(emailStr,'.pt') &&!endOption(emailStr,'.pw') &&!endOption(emailStr,'.py') &&!endOption(emailStr,'.qa') &&!endOption(emailStr,'.re') &&!endOption(emailStr,'.ro') && !endOption(emailStr,'.rr') && !endOption(emailStr,'.ru') &&!endOption(emailStr,'.rw') &&!endOption(emailStr,'.sa') &&!endOption(emailStr,'.sb') &&!endOption(emailStr,'.sc') &&!endOption(emailStr,'.sd') &&!endOption(emailStr,'.se') &&!endOption(emailStr,'.sg') &&!endOption(emailStr,'.sh') &&!endOption(emailStr,'.si') &&!endOption(emailStr,'.sk') &&!endOption(emailStr,'.sl') &&!endOption(emailStr,'.sm') &&!endOption(emailStr,'.so') &&!endOption(emailStr,'.sr') &&!endOption(emailStr,'.ss') &&!endOption(emailStr,'.st') &&!endOption(emailStr,'.su') &&!endOption(emailStr,'.sv') &&!endOption(emailStr,'.sy') &&!endOption(emailStr,'.sz') &&!endOption(emailStr,'.tc') &&!endOption(emailStr,'.td') &&!endOption(emailStr,'.tf') &&!endOption(emailStr,'.tg') &&!endOption(emailStr,'.th') &&!endOption(emailStr,'.tj') &&!endOption(emailStr,'.tk') &&!endOption(emailStr,'.tl') &&!endOption(emailStr,'.tm') &&!endOption(emailStr,'.tn') &&!endOption(emailStr,'.to') &&!endOption(emailStr,'.tp') &&!endOption(emailStr,'.tr') &&!endOption(emailStr,'.tt')&& !endOption(emailStr,'.tv') &&!endOption(emailStr,'.tw') &&!endOption(emailStr,'.tz') && !endOption(emailStr,'.ua') && !endOption(emailStr,'.ug') && !endOption(emailStr,'.uk') && !endOption(emailStr,'.um') && !endOption(emailStr,'.us') && !endOption(emailStr,'.uy') && !endOption(emailStr,'.uz') && !endOption(emailStr,'.va') && !endOption(emailStr,'.vc') && !endOption(emailStr,'.ve') && !endOption(emailStr,'.vg') && !endOption(emailStr,'.vi') && !endOption(emailStr,'.vn') && !endOption(emailStr,'.vu') && !endOption(emailStr,'.wf') && !endOption(emailStr,'.ws') && !endOption(emailStr,'.ye') && !endOption(emailStr,'.yu') && !endOption(emailStr,'.za') && !endOption(emailStr,'.zm') && !endOption(emailStr,'.zw')) //tld options // OK


{
return false;
}


else
{
return true;
}
}[/CODE]


this is part of my client side validation. the same scheme can be adapted for server side (also adaptable to website url validation)
Copy linkTweet thisAlerts:
@SpareSimianauthorSep 25.2008 — TLDs do change from time to time, so you'll have to monitor ICANN and update that list when they do. It would be easier to just require that the host part be a series of alphanumerics separated by dots, possibly ending in a dot. (The final dot is valid but optional and represents the domain root.)

I understand there's a move afoot to allow UTF in hostnames (for I18N), so it may be necessary in the future to allow even more variations.

I see no reason to do more than verify that there's one at-sign and at least one dot after it. More than that doesn't really help anyone, and locks out some users, and it's a maintenance hassle.
×

Success!

Help @SpareSimian spread the word by sharing this article on Twitter...

Tweet This
Sign in
Forgot password?
Sign in with TwitchSign in with GithubCreate Account
about: ({
version: 0.1.9 BETA 5.18,
whats_new: community page,
up_next: more Davinci•003 tasks,
coming_soon: events calendar,
social: @webDeveloperHQ
});

legal: ({
terms: of use,
privacy: policy
});
changelog: (
version: 0.1.9,
notes: added community page

version: 0.1.8,
notes: added Davinci•003

version: 0.1.7,
notes: upvote answers to bounties

version: 0.1.6,
notes: article editor refresh
)...
recent_tips: (
tipper: @AriseFacilitySolutions09,
tipped: article
amount: 1000 SATS,

tipper: @Yussuf4331,
tipped: article
amount: 1000 SATS,

tipper: @darkwebsites540,
tipped: article
amount: 10 SATS,
)...