views:

52

answers:

3

I'm using the excellent validate CFC by Ryan J. Heldt http://validation.riaforge.org/

but have a problem with the email validation RE. RFC 5322 allows the following characters

! # $ % & ' * + - / = ? ^ _ ` { | } ~

however the RE in validate.cfc rejects JohnO'[email protected] because of the apostrophe.

The RE in question is in the following code block

<cffunction name="validateEmail" returntype="void" access="private" output="false">
    <cfargument name="parameters" type="string" required="true" />
    <cfset var rr = 0 />
    <cfloop index="rr" list="#arguments.parameters#" delimiters=";">
        <cfif isDefined("#listGetAt(rr,1,"|")#") and len(_fields[listGetAt(rr,1,"|")]) and not reFind("^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$",_fields[listGetAt(rr,1,"|")])>
            <cfset registerError(listGetAt(rr,1,"|"),listGetAt(rr,2,"|")) />
        </cfif>
    </cfloop>
    <cfreturn />
</cffunction>

my knowledge of RE's is not up to suggesting a solution, and although I have notified Ryan about this (and another bug a year ago) he doesn't seem to be in bug fixing mode.

Can anyone suggest an alternative regular expression please?

+1  A: 

I'll take a stab at updating the RegEx to allow those special characters in the name, but as a general rule of thumb I have very loose validation on email addresses; because seemingly nobody implements them according to spec. My validation usually consists of:

  • contains '@'
  • contains 1+ characters before '@'
  • contains 3+ characters after '@'
  • 1+ characters after '@' must be '.'

While this allows for a lot of false positives to slip through, it also won't create any false negatives.

I'm not going to try to update that regex to spec as it's nowhere near complex enough to match the spec exactly. If you just want to allow special characters in the name, then use this:

and not reFind("^[a-zA-Z][\w\.\##\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$"
Adam Tuttle
Thanks Adam, that let me see how to add the extra characters.
Saul
+1  A: 

This is my typical regex for emails:

^['_a-zA-Z0-9-\+~]+(\.['_a-zA-Z0-9-\+~]+)*@([a-zA-Z_0-9-]+\.)+(([a-zA-Z]{2})|(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel))$
Edward M Smith
I also just added 'JohnO'[email protected]' as a user test for it, and it passes as expected.
Edward M Smith
A: 

what version of CF are you using? Since CF8, you can use IsValid() to check against emails:

<cfset myemail = "[email protected]">
<cfoutput>#IsValid("email", myemail)#</cfoutput>
rip747
You can, but you can't achieve the aim described by author because isValid is not fully compatible with RFC.
Sergii