2009-10-18 132 views
3

如何檢查PHP中的重複電子郵件地址,以及Gmail的自動標籤符和標點符號的可能性心神?如何在PHP中檢查重複的電子郵件地址(考慮Gmail)([email protected])

例如,我希望這些討論爲重複進行檢測:

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

儘管但以理A.懷特稱:在Gmail中,在隨機的地方點前的「@」(和標籤)可放置儘可能多的,你喜歡。 [email protected][email protected]實際上是同一個用戶。

+4

fyi a period是電子郵件地址的唯一部分。我不會排除它不同。 – 2009-10-18 23:58:17

+3

不適用於Gmail,它不是。這些地址都是一樣的:[email protected],[email protected],[email protected] – Kriem 2009-10-19 00:00:01

+0

如果你不相信我,試試吧。 :) – Kriem 2009-10-19 00:00:50

回答

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地址中刪除「。」。正如OP在評論中提到的那樣,大多數郵件提供商都會認可「。」作爲一個有效的字符,使地址不同。 – 2009-10-19 01:00:44

+0

如果你在gmail的其他地址上運行這個代碼,你是對的。如果(in_array($ email_parts [1],'gmail.com','googlemail.com')){ //運行代碼的其餘部分... } – powtac 2009-10-19 09:35:53

+0

這是我的腳本的第1行後面的檢查 ,包括powtac的補充會做到這一點。 – Kriem 2009-10-19 13:55:15

2

比較之前將地址剝離爲基本形式。做一個功能normalise(),將剝離標籤,然後刪除所有的點。如果你必須這樣做很多時候,保存在標準化形式存在的地址太

normalise(address1) == normalise(address2) 

,所以你不必把它們轉換回到過於頻繁:然後你就可以通過比較地址。

+0

打我吧。 :) – 2009-10-19 00:05:16

+0

我完全同意!檢查[我的答案](http://stackoverflow.com/a/42736222/1937344)我使用的'normalize_email()'函數。 – Ema4rl 2017-03-13 09:40:41

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 2009-10-19 00:31:11

+0

非常殘酷。您應該首先檢查它是@ gmail.com還是@ googlemail.com,然後在LHS上執行'str_replace'等等。 – Ema4rl 2017-03-11 10:04:49

1

這也許會更好題爲 「如何在PHP正常化的Gmail郵箱地址,考慮到([email protected])」

你有以上兩種技術方案。我會走一條不同的路線,問你爲什麼要這樣做。我感覺不舒服。您是否試圖阻止某人在您的網站上多次使用不同的電子郵件地址註冊?這隻會阻止這種特殊情況。

我有我自己的域名example.com,並且任何轉到該域中任何地址的電子郵件都發送到我的單個郵箱。你現在是否想要在我的example.com上將任何東西標準化爲一個單一的地址?

official e-mail address format,你試圖匹配的那些地址是相同的。

+0

我有一個很好的例子來說明你爲什麼想要做這 - 我有一個人註冊了一個帳戶,到目前爲止他們已經使用了超過10,000個5個Gmail地址的變體。至於他們從中得到什麼可能的好處,我真的不知道! – Synchro 2014-12-12 15:56:04

1

電子郵件地址的解析是真的,真的很難做正確的,沒有打破的東西和惱人的用戶..

首先,如果你真的需要做到這一點我會質疑?爲什麼你有多個電子郵件地址和不同的子地址?

如果你確信你需要做到這一點,首先閱讀rfc0822,然後修改this email address parsing regex提取郵件的所有部分,並重新組合它們不包括標籤..

略多..實際上,電子郵件地址維基百科頁面有關於這部分地址格式的部分,Sub-addressing

發佈的代碼powtac看起來應該工作 - 只要你沒有以自動的方式使用它刪除帳戶或任何東西,它應該沒問題。

請注意,「自動貼標機」不是Gmail的特定功能,Gmail只是普及它。其他郵件服務器支持此功能,有些使用+作爲分隔符,其他使用-。如果您要在GMail地址中使用特殊空格,請記住考慮googlemail.com域也

+0

我喜歡這個答案,並提出了相關的問題(http://stackoverflow.com/q/42760794/1937344)。我需要答案! – Ema4rl 2017-03-13 10:00:13

1

我已經像這樣擴展了Zend Validator。

與Gmail地址不止一個「點」符號
<?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; 
    } 
} 

電子郵件被視爲無效。在某些情況下,這不是合乎邏輯的解決方案,但對我來說很有用。

1

這個答案是對@ powtac答案的改進。我需要這個功能來打敗使用gmail的同一個人的多個註冊。

5205​​
相關問題