2010-10-06 9 views
0

J'utilise cette fonction pour valider les adresses e-mail, mais il ne fonctionne pas si l'adresse e-mail est comme ceci:pour valider les adresses e-mail

[email protected] 
OR 
//[email protected] 

Y at-il un moyen de développer cette fonction?

function validEmail($email) 
{ 
    $isValid = true; 
    $atIndex = strrpos($email, "@"); 
    if (is_bool($atIndex) && !$atIndex) 
    { 
     $isValid = false; 
    } 
    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 = false; 
     } 
     else if ($domainLen < 1 || $domainLen > 255) 
     { 
     // domain part length exceeded 
     $isValid = false; 
     } 
     else if ($local[0] == '.' || $local[$localLen-1] == '.') 
     { 
     // local part starts or ends with '.' 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $local)) 
     { 
     // local part has two consecutive dots 
     $isValid = false; 
     } 
     else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) 
     { 
     // character not valid in domain part 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $domain)) 
     { 
     // domain part has two consecutive dots 
     $isValid = false; 
     } 
     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 = false; 
     } 
     } 
     if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) 
     { 
     // domain not found in DNS 
     $isValid = false; 
     } 
    } 
    return $isValid; 
} 
+7

[Comment valider eMails en PHP a été répondu à plusieurs reprises avant] (http://stackoverflow.com/search?q=validate+email+php). [PHP a une fonction de filtre natif pour cela] (http://de.php.net/manual/fr/function.filter-var.php). – Gordon

+0

De nombreuses expressions régulières ont été créées pour valider les e-mails. Il suffit de google "email regex" et vous obtiendrez un certain nombre de résultats. –

+0

vous avez raison, je vérifie la fonction de filtre juste maintenant –

Répondre

1

Utilisez filter_var(). Voici une démonstration d'utilisation simple. De nombreuses autres options sont disponibles.

<?php 

    // You might want to trim whitespace first: 
$possibleEmailAddress = trim($possibleEmailAddress); 

filter_var($possibleEmailAddress, FILTER_VALIDATE_EMAIL); 

// Returns false if $possibleEmailAddress doesn't appear valid. 
// Returns the email string if it does appear okay. 
?> 

live example

Notez que //[email protected] est un e-mail valide, mais [email protected] n'est pas. Vous devriez couper la période de la fin pour la rendre valide. Vous ne pouvez pas simplement utiliser trim(), car les périodes au début d'un e-mail peuvent être valides et intentionnelles.

-2
function checkEmail($email) 
    { 
    $patern = '/^[a-zA-Z0-9.\-_][email protected][a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/'; 
    if (preg_match($patern , $email)) 
     { 
     return TRUE; 
     } 
    else 
     { 
     return FALSE; 
     } 
    } 
} 

le plus simple

+0

et faux. ne tient même pas compte des signes + dans la partie locale. – mario

+0

et rejette les domaines de premier niveau existants, comme '.museum' –

-2

Ou, même que celui Asar, mais plus court:

function checkEmail($email) { 
    $patern = '/^[a-zA-Z0-9.\-_][email protected][a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/'; 
    return preg_match($patern , $email); 
} 
+0

Rejette les domaines' .museum' etc., rejette l'une de mes adresses e-mail * actuelles * qui contient un '+ '. –

+0

Je viens de simplifier le code et la regex d'Asar; merci à tous de voter>< – jorenl