2009-10-18 2 views
3

Как проверить дубликаты адресов электронной почты в PHP с возможностью автоматической маркировки и пунктуации Gmail в разум?Как проверить дубликат адреса электронной почты в PHP, учитывая Gmail ([email protected])

Например, я хочу, чтобы это адресованным быть обнаружен как дублирующие:

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

Несмотря на то, что Даниэль А. Белый утверждает: В Gmail точка в случайных местах до «@» (и метка) может быть поместили столько, сколько хотите. [email protected] и [email protected] - фактически тот же пользователь.

+4

fyi a period - уникальная часть адреса электронной почты. я не исключал бы его как другое. –

+3

Не для Gmail это не так. Эти адреса одинаковы: [email protected], [email protected], [email protected] – Kriem

+0

Попробуйте, если вы мне не верите. :) – Kriem

ответ

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

Вероятно, вы хотите удалить «.» С адресов GMail. Как упоминалось в комментариях к ОП, большинство почтовых провайдеров признают «.». как действительный символ, делая адреса разными. –

+0

Вы правы, если вы используете этот код на других адресах, чем gmail. Просто проверьте после строки 1 моего сценария if (in_array ($ email_parts [1], 'gmail.com', 'googlemail.com')) { // пробег остальной части кода ... } – powtac

+0

Это , в том числе дополнение powtac, сделало бы трюк. – Kriem

2

Перед сравнением разделите адрес на основную форму. Сделайте функцию normalise(), которая разделит этикетку, а затем удалит все точки. Тогда вы можете сравнить адреса с помощью:

normalise(address1) == normalise(address2) 

Если вы должны делать это очень часто, за исключением адреса в нормированном виде, так что вы не должны преобразовать их обратно слишком часто.

+0

Побей меня. :) –

+0

Я согласен полностью! Проверьте [мой ответ] (http://stackoverflow.com/a/42736222/1937344) для функции normalize_email(), которую я использую. – Ema4rl

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

'$ input = str_replace ('.', '', $ Input);' кажется немного жестоким. Он сделает «[email protected]» и «[email protected]» тем же самым. – dbr

+0

Очень жестоко. Вы должны сначала проверить, является ли это @ gmail.com или @ googlemail.com, затем выполните 'str_replace' на LHS ... и т. Д. – Ema4rl

1

Возможно, это будет лучше, под названием "Как нормализовать GMAIL адреса в PHP, учитывая ([email protected])"

У вас есть два технических решений выше. Я пойду по другому пути и спрошу, почему вы пытаетесь это сделать. Мне это не нравится. Вы пытаетесь запретить кому-то регистрироваться несколько раз на вашем сайте с использованием разных адресов электронной почты? Это предотвратит только специализированный случай.

У меня есть свой домен, example.com, и любое электронное письмо, которое отправляется на любой адрес этого домена, отправляется на мой единственный почтовый ящик. Вы теперь хотите поставить чек, чтобы нормализовать что-либо на моем example.com на один адрес на вашем конце?

К official e-mail address format, адреса, которые вы пытаетесь найти, одинаковы.

+0

У меня есть хороший в-диком примере, почему вы хотите сделать это - у меня был кто-то, подписавшийся на учетную запись, и до сих пор они использовали более 10 000 вариантов из 5 адресов gmail. Что касается того, какую возможную выгоду они получают от этого, я действительно не знаю! – Synchro

1

Адрес электронной почты разборе действительно, очень трудно сделать правильно, не нарушая вещи и раздражающие пользователей ..

Во-первых, я бы вопрос, если вам действительно нужно это сделать? Почему у вас несколько адресов электронной почты с разными суб-адресами?

Если вы уверены, что вам нужно сделать это, сначала прочтите rfc0822, а затем изменить this email address parsing regex извлечь все части электронной почты, и сливают за исключением этикетки ..

Чуть больше .. практически, адрес электронной почты, Страница wikipedia содержит раздел по этой части формата адреса, Sub-addressing.

Код powtac размещен, как будто он должен работать - до тех пор, пока вы не используете его автоматическим способом для удаления учетных записей или чего-то еще, все должно быть хорошо.

Обратите внимание, что «автоматическая этикетка» не является специфичной для GMail функцией, Gmail просто популяризировала ее. Другие почтовые серверы поддерживают эту функцию, некоторые используют + в качестве разделителя, другие используют -.Если вы отправляетесь на специальные места в адресах GMail, не забудьте также рассмотреть домен googlemail.com

+0

Мне нравится этот ответ и задан соответствующий вопрос (http://stackoverflow.com/q/42760794/1937344). Мне нужны ответы! – Ema4rl

1

У меня есть расширенный Zend Validator.

<?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; 
    } 
} 

Адрес электронной почты с более чем одним символом «точка» в адресе gmail считается недействительным. В некоторых случаях это не логическое решение, но это работает для меня.

1

Этот ответ является улучшением ответа @ powtac. Мне нужна эта функция, чтобы победить несколько подписчиков от одного и того же человека, используя 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; 
    } 
} 
Смежные вопросы