我可以在Google账户(Gmail)中创建无限数量的电子邮件别名,参考:http://www.gizmodo.com.au/2014/09/how-to-use-the-infinite-number-of-email-addresses-gmail-gives-you/。但是我需要过滤电子邮件地址,以避免用户在我的应用程序中使用相同的原始电子邮件进行注册。我想知道是否有任何解决方法?或者我的唯一选择是使用正则表达式进行过滤?
我不同意那个评论直接说你不应该剥离“过滤器”(例如,user_email+some_filter_to_flag_incoming_messages
@example.org)。"你的用例和我的用例不一样"等等。[0]
简而言之:你要找的正则表达式模式是:'(\+.*)(?=\@)'
解释:
首先,编写一个正则表达式,匹配文字“+”和任何单个字符,任意次数:
'(\+.*)'
当用空字符串替换此模式时,将会把 tristan+some_filter@example.org
转换为 tristan
。如果您决定在 @ 符号上拆分,那么恭喜您,将结果字符串连接到 '@' + domain.TLD 就完成了。我提到这一点是因为您可能已经拆分了电子邮件地址,但它仍然存在。
如果您不在 @ 符号上拆分用户电子邮件地址,则需要使用“正向先行断言”(如果它前面跟着我指定的内容,则匹配此模式)来告诉您的匹配何时停止(以便我们不会取走太多):
'(\+.*)(?=\@)'
tristan@example.org
。太好了,实际上并不那么困难。
[0]: 在我的一个应用程序中,我存储用户提供的包含筛选器的原始电子邮件地址以进行通信,但跟踪筛选器使用情况,并将经过引用内部参考的规范帐户(例如user_email@gmail.com)视为没有筛选器的版本。我这样做是为了让选择通过电子邮件地址相互查找的用户更容易。
我理解人们为什么使用别名/筛选器:
这就是说,“我明白了,人们喜欢筛选器”,但作为应用程序作者或公司,记录它们是有合理理由的。
php
中的函数,用来完成这个操作:function unalias_gmail($email) {
return preg_replace('/(\+[^\@]+)/', '', $email);
}
如果有别名,此代码将返回电子邮件地址中的电子邮件地址,否则将返回给定的电子邮件地址。我有一个phpunit的dataProvider,你可以看到我的测试:
<?php
require_once __DIR__ . '/path/to/helper.php';
use PHPUnit\Framework\TestCase;
class HelperTest extends TestCase
{
public function data_test_unalias_gmail(): array
{
return array(
// Provided email vs the expected result
array('foo@gmail.com', 'foo@gmail.com'),
array('foo_bar@gmail.com', 'foo_bar@gmail.com'),
array('foo-bar@gmail.com', 'foo-bar@gmail.com'),
array('foo+bar@gmail.com', 'foo@gmail.com'),
);
}
/**
* @dataProvider data_test_unalias_gmail
*/
public function test_unalias_gmail($email, $expected): void
{
$actual = unalias_gmail($email);
$this->assertEquals($expected, $actual);
}
}
OK (4个测试, 4个断言)
=]
注意: 如果他们开始允许在域名中使用加号,这将需要一些修改!