Wednesday, January 05, 2005

javascript regexp email validator

I have been looking for a javascript email regexp email validator. And I found one from this web site. And the code is "/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i"

This code looks nice.

However, I am not totally satisfied with the code. Because there are emails addresses don't look like "". For example, I used to send email to an address like "joel@". So I am going to make some change to the regular expression filter.

Update 1: "/^([\w-]+(?:\.[\w-]+)*)\@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$|(\[?(\d{1,3}\.){3}\d{1,3}\]?)$/i" will detect email like "abc@" or "abc@[]".

Update 2: /^([\w-]+(?:\.[\w-]+)*)\@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$|(\[?(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\]?)$/i

Now this one won't let a.b.c@ slip.

Update 3: /^(("?)[\w- ]+\1)|([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$|(\[?(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\]?)$/i

Now this regular expression thinks "Guy Joel" or "Guy Joel" are good email address.

Update 4: /^(("?)[\w-\s]+\1)|([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$|(\[?(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\]?)$/i

A little bit more update on space in the regexp.

Update 5: /^("[\w-\s]+")?([\w-]+(?:\.[\w-]+)*)?@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$|(\[?(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\]?)$/i

Made a big mistake in the last one. So, another update.

Update 6: /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$|(\[?((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\]?)$/i

It's getting longer and longer, better and better.

Update 7: /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i

The update 6 thinks is a legal ip address, fixed in update 7.

\"Guy Joel\"guy.joel@[
\"Guy Joel\"@[]pass
\"Guy Joel\"@9.999.99.25fail
\"Guy Joel\"@999.99.99.25fail
"\"Guy Joel\""fail

Also, regular expression for url validation.

Labels: , , ,


Anonymous Anonymous said...

fails with thiws:

9:18 AM  
Blogger cyfer said...

I tried "", passed.

3:48 PM  
Blogger John said... pass. Shouldn't it fail?

4:43 AM  
Blogger cyfer said...

You are right. But the code has become ridiculous, I am not sure if I will work on it.

10:42 AM  
Anonymous JohnM said...

How about a different approach?

Check for an @ sign, then use ajax and a php script to try to connect to the base host, everything after @, using fsockopen to verify it is a real host.

Then you just need to check the @ sign exists and there is at least 1 character before it and you should be right..

12:53 AM  
Blogger Nick said...

johnm: Good idea. Connecting to the host is unnecessary, though. You could simply do a DNS lookup and verify that the host as an MX record.

2:25 PM  
Blogger cyfer said...

Of course you can do that. But the purpose of this piece of code I wrote several years ago was not to catch faked email address. People can always fake email address, I can even register a new one and forget it forever, I actually forgot many of them.

The purpose of this code is to catch input mistakes, and prevent those mistakes from reaching the sever. As a result, the server take less load.

8:22 PM  
Blogger Krov_za_krov said...

fails with «+» symbol.

11:13 AM  
Anonymous Bob said...

This is an interesting problem, thanks for not only "providing a solution", but also showing the though processes associated with each version.

btw, there are some mistakes (I know that you have no intention of making additional changes).

- The square brackets around the IP address, if unbalanced, will still "Pass".
e.g., "me@["

- It is my understanding that the stuff in quotes at the beginning may contain more than Letters, digits, underscore, and space. e.g., this should be valid:

"Joseph A. (Joe) Cool"

Thanks for sharing.

9:39 AM  
Blogger Sach said...

Hi programmers,

It may helpful to you.

var emailRegex= new RegExp(/^([a-zA-Z0-9]{3,})(((\.|\-|\_)[a-zA-Z0-9]{2,})+)?@([a-z]{3,})(\-[a-z0-9]{3,})?(\.[a-z]{2,})+$/);



1:56 PM  

Post a Comment

<< Home