2009-10-18 10 views
3

Comment puis-je vérifier les adresses e-mail en double dans PHP, avec la possibilité de l'étiqueteuse automatique et la ponctuation de Gmail dans esprit?Comment vérifier une adresse e-mail en double en PHP, compte tenu de Gmail ([email protected])

Par exemple, je veux que ces adressée à détecter comme des doublons:

  [email protected] 
     [email protected] 
    [email protected] 
    [email protected] 

Malgré ce que Daniel A. affirme Blanc: Dans Gmail, des points à des endroits aléatoires avant le « @ » (et l'étiquette) peut être placé autant que vous voulez. [email protected] et [email protected] sont en fait le même utilisateur.

+4

fyi une période est une partie unique d'une adresse e-mail. Je ne voudrais pas l'exclure comme différent. –

+3

Pas pour Gmail ce n'est pas le cas. Ces adresses sont les mêmes: [email protected], [email protected], [email protected] – Kriem

+0

Essayez-le si vous ne me croyez pas. :) – Kriem

Répondre

5
$email_parts = explode('@', $email); 

// check if there is a "+" and return the string before 
$before_plus = strstr($email_parts[0], '+', TRUE); 
$before_at  = $before_plus ? $before_plus : $email_parts[0]; 

// remove "." 
$before_at  = str_replace('.', '', $before_at); 

$email_clean = $before_at.'@'.$email_parts[1]; 
+2

Vous ne voulez probablement que supprimer les "." S des adresses GMail. Comme mentionné dans les commentaires sur le PO, la plupart des fournisseurs de messagerie reconnaîtra "." comme un caractère valide, rendant les adresses différentes. –

+0

Vous avez raison si vous utilisez ce code sur d'autres adresses que celles de Gmail. Vérifiez juste après la ligne 1 de mon script if (in_array ($ email_parts [1], 'gmail.com', 'googlemail.com')) { // exécutez le reste du code ... } – powtac

+0

This , y compris l'ajout de powtac ferait l'affaire. – Kriem

2

Dénudez l'adresse sur le formulaire de base avant de procéder à la comparaison. Faire une fonction normalise() qui va enlever l'étiquette, puis enlever tous les points. Ensuite, vous pouvez comparer les adresses via:

normalise(address1) == normalise(address2) 

Si vous devez le faire très souvent, enregistrez les adresses sous forme normalisée aussi, de sorte que vous ne devez pas les convertir trop souvent.

+0

Battez-moi. :) –

+0

Je suis totalement d'accord! Vérifiez [ma réponse] (http://stackoverflow.com/a/42736222/1937344) pour la fonction 'normalize_email()' que j'utilise. – Ema4rl

0
function normalize($input) { 
    $input = str_replace('.', '', $input); 
    $pattern = '/\+(\w+)@/'; 
    return preg_replace($pattern, '@', $input); 
} 
+2

'$ input = str_replace ('.', '', $ Input);' semble un peu brutal. Cela fera de "[email protected]" et "[email protected]" le même .. – dbr

+0

Très brutal. Vous devriez d'abord vérifier si c'est un @ gmail.com ou @ googlemail.com, puis faire le 'str_replace' sur le LHS ... etc – Ema4rl

1

Peut-être que ce serait mieux intitulé "Comment normaliser les adresses gmail en PHP, considérant ([email protected])"

Vous avez deux solutions techniques ci-dessus. Je vais faire un itinéraire différent et demander pourquoi vous essayez de le faire. Cela ne me semble pas juste. Essayez-vous d'empêcher quelqu'un de vous enregistrer plusieurs fois sur votre site en utilisant différentes adresses e-mail? Cela empêchera seulement un cas spécialisé de cela.

J'ai mon propre domaine, example.com, et tout courriel envoyé à n'importe quelle adresse de ce domaine est envoyé à ma seule boîte aux lettres. Voulez-vous, maintenant, mettre une vérification pour normaliser quelque chose sur mon exemple.com à une seule adresse de votre côté?

Par le official e-mail address format, les adresses que vous essayez de faire correspondre sont les mêmes.

+0

J'ai un bel exemple de la raison pour laquelle vous voudriez faire ceci - J'ai eu quelqu'un qui s'est inscrit pour un compte, et jusqu'ici ils ont employé plus de 10.000 variantes de 5 adresses de gmail. Quant à savoir quel bénéfice ils en retirent, je ne sais vraiment pas! – Synchro

1

parsing Adresse e-mail est vraiment, vraiment difficile à faire correctement, sans casser les choses et les utilisateurs ennuyeux ..

D'abord, je demander si vous avez vraiment besoin de faire cela? Pourquoi avez-vous plusieurs adresses e-mail avec différentes sous-adresses?

Si vous êtes sûr que vous devez faire, lisez d'abord rfc0822, puis modifier this email address parsing regex pour extraire toutes les parties de l'e-mail, et recombiner les excluant l'étiquette ..

Un peu plus .. En pratique, l'adresse e-mail page wikipedia a une section sur cette partie du format d'adresse, Sub-addressing.

Le code affiché par powtac semble devoir fonctionner - tant que vous ne l'utilisez pas de manière automatisée pour supprimer des comptes ou quoi que ce soit, ça devrait aller. Notez que "l'étiqueteuse automatique" n'est pas une fonctionnalité spécifique de GMail, Gmail l'a simplement popularisée. D'autres serveurs de messagerie supportent cette fonctionnalité, certains utilisant + comme séparateur, d'autres utilisant -.Si vous allez dans des espaces spéciaux dans les adresses GMail, n'oubliez pas de considérer le domaine googlemail.com également

+0

J'aime cette réponse et a posé une question connexe (http://stackoverflow.com/q/42760794/1937344). J'ai besoin de réponses! – Ema4rl

1

J'ai prolongé Zend Validator comme ceci.

<?php 
class My_Validate_EmailAddress extends Zend_Validate_EmailAddress 
{ 
    public function isValid($value) 
    { 
     $valid = parent::isValid($value); 
     if ($valid 
       && in_array($this->_hostname, array('gmail.com', 'googlemail.com')) 
       && substr_count($this->_localPart, '.') > 1) { 
      $this->_error(parent::INVALID_HOSTNAME); 
      $valid = false; 
     } 
     return valid; 
    } 
} 

E-mail avec plus d'un symbole «point» dans l'adresse Gmail sont considérés comme invalides. Pour certains cas, ce n'est pas une solution logique, mais cela fonctionne pour moi.

1

Cette réponse est une amélioration par rapport à la réponse de @ powtac. J'avais besoin de cette fonction pour vaincre les multiples inscriptions de la même personne utilisant Gmail.

if (! function_exists('normalize_email')) 
{ 
    /** 
    * to normalize emails to a base format, especially for gmail 
    * @param $email 
    * @return string 
    */ 
    function normalize_email($email) { 
     // ensure email is lowercase because of pending in_array check, and more... 
     $email = strtolower($email); 
     $parts = explode('@', $email); 

     // normalize gmail addresses 
     if (in_array($parts[1], ['gmail.com', 'googlemail.com'])) { 
      // check if there is a "+" and return the string before then remove "." 
      $before_plus = strstr($parts[0], '+', TRUE); 
      $before_at  = str_replace('.', '', $before_plus ? $before_plus : $parts[0]); 

      // ensure only @gmail.com addresses are used 
      $email = $before_at.'@gmail.com'; 
     } 

     return $email; 
    } 
}