4

Gmailの自動ラベラーと句読点の可能性を念頭に置いて、PHPで重複するメールアドレスを確認するにはどうすればよいですか?

たとえば、これらのアドレスを重複として検出する必要があります。

         username@gmail.com
        user.name@gmail.com
   username+label@gmail.com
  user.name+label@gmail.com

Daniel A. Whiteの主張にも関わらず、Gmailでは、「@」(およびラベル)の前のランダムな場所にドットを好きなだけ配置できます。user.name@gmail.comとusername@gmail.comは実際には同じユーザーです。

4

7 に答える 7

6
$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];
于 2009-10-19T00:14:24.687 に答える
2

比較する前に、アドレスを基本形式に取り除きます。normalise()ラベルをはがし、すべてのドットを削除する関数を作成します。次に、次の方法でアドレスを比較できます。

normalise(address1) == normalise(address2)

非常に頻繁に行う必要がある場合は、アドレスも正規化された形式で保存して、頻繁に元に戻す必要がないようにしてください。

于 2009-10-19T00:04:52.133 に答える
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 アドレスに複数の「ドット」記号を含むメールは無効と見なされます。場合によっては、これは論理的な解決策ではありませんが、私にとってはうまくいきます。

于 2011-07-19T08:29:00.737 に答える
1

おそらく、これは「(user.name+label@gmail.com)を考慮して、PHPでgmailアドレスを正規化する方法」というタイトルの方が適切でしょう。

上記の 2 つの技術的な解決策があります。別のルートに行き、なぜこれをやろうとしているのかを尋ねます。それは私には正しくありません。誰かが異なる電子メール アドレスを使用してサイトに複数回登録するのを防ごうとしていますか? これは、その特殊なケースを防ぐだけです。

私は独自のドメイン example.com を持っており、そのドメインの任意のアドレスに送信される電子メールはすべて、私の 1 つのメールボックスに送信されます。さて、私の example.com にあるすべてのものを、あなたの側で単一のアドレスに正規化するチェックを入れますか?

正式なメールアドレスの形式により、同じとして照合しようとしているアドレスが異なります。

于 2009-10-19T00:49:51.543 に答える
1

電子メールアドレスの解析は、物事を壊したりユーザーを悩ませたりすることなく、正しく行うのは本当に、本当に難しいです..

最初に、本当にこれを行う必要があるかどうかを質問します。サブアドレスが異なる複数のメールアドレスを持っているのはなぜですか?

これを行う必要があることが確実な場合は、最初にrfc0822を読んでから、この電子メール アドレスの解析正規表現を変更して電子メールのすべての部分を抽出し、ラベルを除いてそれらを再結合します。

もう少し.. 実際には、電子メール アドレスのウィキペディア ページには、アドレス形式のこの部分に関するセクション、サブアドレス指定があります。

powtac が投稿したコードは機能するはずです。アカウントなどを削除するために自動化された方法で使用していない限り、問題ありません。

「自動ラベラー」は GMail 固有の機能ではなく、Gmail が普及させただけであることに注意してください。他のメール サーバーはこの機能をサポートして+ おり、セパレータとして使用するものもあれば、 -. GMail アドレスで特殊なスペースを使用する場合は、googlemail.comドメインも考慮することを忘れないでください

于 2009-10-19T00:51:29.450 に答える
-1
function normalize($input) {
     $input = str_replace('.', '', $input);
     $pattern = '/\+(\w+)@/';
     return preg_replace($pattern, '@', $input);
}
于 2009-10-19T00:26:43.073 に答える