Mail::RFC822::Address: "Download Mail::RFC822::Address-0.4.tar.gz or read the documentation.
The grammar described in RFC 822 is suprisingly complex. Implementing validation with regular expressions somewhat pushes the limits of what it is sensible to do with regular expressions, although Perl copes well:
(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[
\t]))*'(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
\t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[
\t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*'(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*'(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\'.\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'
(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\
'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\'.\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\'.\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|'(?
:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\
'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\['()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.\[\
]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['
()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>
@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
\t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,
;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\
'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\['()<>@,;:\\'.
\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
'()<>@,;:\\'.\[\]]))|'(?:[^\'\r\\]|\\.|(?:(?:\r\n)?[ \t]))*'(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\'.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\['()<>@,;:\\'.\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)
This regular expression will only validate addresses that have had any comments stripped and replaced with whitespace (this is done by the module)."
Tuesday, June 16, 2009
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment