Jump to content

Refining Email RegEx Validation


Psycho

Recommended Posts

I have an email validation expression that works, but I want to see if there is a way to refine one part and/or add one additional check.

 

Here is the expression:

 

/^[\w\+-]+([\.]?[\w\+-])*@[a-zA-Z0-9]{2,}([\.-]?[a-zA-Z0-9]{2,})*\.[a-zA-Z]{2,4}$/

 

The BOLD blue section ensures the username consists of 1 or more valid characters (alpha, numeric, '_', '+', '-')

The blue section allows the user to have zero or more sub elements (separated w/ a period) with the same valid characters

The BOLD red section ensures the domail consists of 2 or more valid characters (alps, numeric)

The red section allows the domain to have zero or more sub domains (separated w/ a period or '-') and the same valid characters [yes, the dash is not a sub-domain delimiter, but it is not acceptable at the begining or end of a domain just like the period]

The BOLD green section ensures the TLD consists of 2 to 4 acceptable characters (alpha or numeric)

 

So, my question are:

 

1) Can the blue sections be combined more efficiently into one such that the usrename can accept a period, but not at the beginning or end, and cannot appear in succession?

 

2) Can the red section be combined into one such that a period or dash cannot be at the beginning or end - and they cannot appear in succession of each other?

 

3) How can I add a minimum/maximum check to the entirety of the blue section and/or the (red + green sections)? I want to ensure the username is between 1-64 characters and the domain is between 5-255 characters.

 

Currently for #3 I am using a second regex test as follows:

 

/^(.{1,64})@(.{4,255})$/

Link to comment
https://forums.phpfreaks.com/topic/91772-refining-email-regex-validation/
Share on other sites

I think it's best the way you have it, with a few improvements:

 

Blue: [-\w+]+(?:\.[-\w+])*

Red: [a-z\d]{2,}(?:[-.][a-z\d]{2,})* (with the /i modifier)

 

I tried grouping everything into the following, but I received "Compilation failed: regular expression too large":

%

^

### User name

(?:

[\w+]

|

(?<!^|\.) \. (?![@.])

){1,64}

@

### Domain

(?:

[a-z\d](?=[a-z\d])

|

(?<=[a-z\d])[a-z\d]

|

(?<![-.]) [-.] (?![-.])

){4,255}

### Extension

\.[a-z]{2,4}

$

%ix

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.