Search code examples
validationcoldfusionemail-validation

validate.cfc Regular expression help for email


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?


Solution

  • 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]$"