方案是我想只接受来自persion忽略gmail别名的唯一电子邮件地址(如果任何其他服务做类似的事情)
这样做的原因是我们提供了有限数量的折扣代码,并且公平地说,我们不希望有人声称只有一个电子邮件地址。
根据我的理解:
gmail.com
或googlemail.com
,则删除+
之后的任何内容,因为这是别名。gmail
,则删除username
中的任何点,因为它们会被忽略。 john.smith@
与johnsmith@
+
符号无效,因为它对电子邮件地址有效。我是否需要了解其他服务,允许用户将其电子邮件地址别名为多种形式以及我的方案的任何其他注意事项。
更新我确实有一个数据库来存储带有电子邮件地址和声明代码的提交。
我也明白,很难阻止人们直截了当地声称多个代码。不允许使用别名可能会减少它。
干杯。
答案 0 :(得分:3)
编写代码以忽略单个服务(如Gmail)中的少数已知别名格式并不是什么大问题。然而,试图阻止一个人单独根据电子邮件地址声称多次折扣是一项不可能完成的任务。
有许多不同的方法可以创建新的电子邮件地址和别名。例如,有一些服务允许您创建一次性电子邮件,通过它可以根据需要拥有尽可能多的不同地址。此外,只需几美元,您就可以使用自己的域名获得自己的电子邮件主机,您可以在其中注册一堆地址和/或捕获所有地址。
需要花费过多的资源来阻止任何人决定要求一大堆折扣。除了电子邮件地址之外,不是没有其他识别方法。
我会考虑添加其他验证方法。根据您正在做的事情,这可能是链接到Facebook,甚至要求信用卡详细信息进行验证。
答案 1 :(得分:0)
在这种情况下,您可以使用Regex。使用此代码,您可以将电子邮件数组转换为别名数组(您可以为每个邮件服务自定义符号模式):
代码:
$mails = ['johnsmith@gmail.com', 'johnsmith@yahoo.com', 'jo.hn.sm.ith@gmail.com'];
$valid_mails = [];
$pattern = "/^(?P<name>[A-Za-z0-9._+\-\']+)@(?P<mail>[A-Za-z0-9.\-]+)\.[A-Za-z]{2,}$/";
$symbol_pattern = ['gmail'=>'/(\.|\+|-)/','yahoo'=>'/(\.)/'];
foreach ($mails as $key=>$mail) {
$valid_mails[$key] = preg_replace_callback($pattern, function($match){
global $symbol_pattern;
return preg_replace($symbol_pattern[$match['mail']], '', $match['name']);
}, $mail);
}
var_dump($valid_mails);
<强>输出强>:
array(3) { [0]=> string(9) "johnsmith" [1]=> string(9) "johnsmith" [2]=> string(9) "johnsmith" }