2009-10-18 141 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​​
相关问题