otuatail Posted March 30, 2010 Share Posted March 30, 2010 Hi I have been given a link to a website here for validating an email. It is very extensive and comes with a list of valid and invalid email address to test. The problem is, one of the emails that fails passes. [email protected]. this should fail as it ends with a (.) Can anyone find the offending part of the regex. function validEmail($email) // RFC 2822 3.4.1 a-z0-9!#$%&'*+-/=?^_`{|}~ { $isValid = 1; $atIndex = strrpos($email, "@"); if (is_bool($atIndex) && !$atIndex) { $isValid = 0; } else { $domain = substr($email, $atIndex+1); $local = substr($email, 0, $atIndex); $localLen = strlen($local); $domainLen = strlen($domain); if ($localLen < 1 || $localLen > 64) { // local part length exceeded $isValid = 0; } else if ($domainLen < 1 || $domainLen > 255) { // domain part length exceeded $isValid = 0; } else if ($local[0] == '.' || $local[$localLen-1] == '.') { // local part starts or ends with '.' $isValid = 0; } else if (preg_match('/\\.\\./', $local)) { // local part has two consecutive dots $isValid = 0; } else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) { // character not valid in domain part $isValid = 0; } else if (preg_match('/\\.\\./', $domain)) { // domain part has two consecutive dots $isValid = 0; } else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) { // character not valid in local part unless // local part is quoted if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) { $isValid = 0; } } /* if ($isValid && !(checkdnsrr($domain,"MX") || ?checkdnsrr($domain,"A"))) { // domain not found in DNS $isValid = 0; }*/ } return $isValid; } // Some Useful VB functions function Cint($value) { if(!is_numeric($value)) return 0; else return (int)$value; } Sorry about this but I cant get my head around this level of regex. Desmond. Link to comment https://forums.phpfreaks.com/topic/197025-regex-an-email/ Share on other sites More sharing options...
Psycho Posted April 1, 2010 Share Posted April 1, 2010 Not interested in wading through all of that code, especially when I have a two line function that will validate an email format: function is_email($email) { $formatTest = '/^[\w!#$%&\'*+\-\/=?^`{|}~]+(\.[\w!#$%&\'*+\-\/=?^`{|}~]+)*@[a-z\d]([a-z\d-]*[a-z\d])?(\.[a-z\d]([a-z\d-]*[a-z\d])?)*\.[a-z]{2,6}$/i'; $lengthTest = '/^(.{1,64})@(.{4,255})$/'; return (preg_match($formatTest, $email) && preg_match($lengthTest, $email)); } Here are the details of the exact validation properties: // NOTES: // // Format test // - Username: // - Can contain the following characters: // - Uppercase and lowercase English letters (a-z, A-Z) // - Digits 0 to 9 // - Characters _ ! # $ % & ' * + - / = ? ^ ` { | } ~ // - May contain '.' (periods), but cannot begin or end with a period // and they may not appear in succession (i.e. 2 or more in a row) // - Must be between 1 and 64 characters // - Domain: // - Can contain the following characters: 'a-z', 'A-Z', '0-9', and '-' (hyphen). // - There may be subdomains, separated by a period (.), but the combined domain may not begin with a period // and they not appear in succession (i.e. 2 or more in a row) // - Hostname parts may not begin or end with a hyphen // - TLD accepts: 'a-z' & 'A-Z' // // Note: the domain and tld parts must be between 4 and 256 characters total // // Length test // - Username: 1 to 64 characters // - Domain: 4 to 255 character Link to comment https://forums.phpfreaks.com/topic/197025-regex-an-email/#findComment-1035555 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.