issue 5
(Better email validation regexp) reported by ozhozh
- I think the closest-to-perfection email validation is the following stuff:
http://www.addedbytes.com/php/email-address-validation
function is_valid_email($email) {
// Email invalid because wrong number of characters in one section, or
wrong number of @ symbols.
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email))
return false;
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if
(!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$",
$local_array[$i])) {
return false;
}
}
if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is
IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if
(!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$",
$domain_array[$i])) {
return false;
}
}
}
return true;
}
Much more reliable than the single line you're using
I think the closest-to-perfection email validation is the following stuff:
http://www.addedbytes.com/php/email-address-validation
function is_valid_email($email) {
// Email invalid because wrong number of characters in one section, or
wrong number of @ symbols.
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email))
return false;
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if
(!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$",
$local_array[$i])) {
return false;
}
}
if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is
IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if
(!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$",
$domain_array[$i])) {
return false;
}
}
}
return true;
}
Much more reliable than the single line you're using
Feb 02, 2009
issue 4
(email validation regex is broken for dashes!) reported by ches.martin
- preg_match("/^[A-Z0-9._%-\+]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i", $email);
The dash in the first part is trying to specify a range. It needs to be
escaped with a backslash, or put at the end of the bracket set. I'd attach
a patch but it's one character ;-)
So, we've been denying folks with dashes for all this time!
preg_match("/^[A-Z0-9._%-\+]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i", $email);
The dash in the first part is trying to specify a range. It needs to be
escaped with a backslash, or put at the end of the bracket set. I'd attach
a patch but it's one character ;-)
So, we've been denying folks with dashes for all this time!