如何使用PHP过滤/删除Google Email ALIAS?

Jon*_*Dev 5 php regex email email-validation google-account

我可以在Google帐户(Gmail)中创建无限制的电子邮件别名,参见:http://www.gizmodo.com.au/2014/09/how-to-use-the-infinite-number-of-email-addresses- Gmail的,给,你/

但我需要过滤电子邮件地址,以避免用户在我的应用程序中使用相同的原始电子邮件进行注册.

我想知道是否有什么可以解决这个问题?或者我的唯一选择是使用正则表达式进行过滤?

小智 12

我不同意这句话直截了当地说你不应该删除"过滤器"(例如user_email +some_filter_to_flag_incoming_messages@ example.org)."您的使用案例与我的用例不同"等等.[0]

tl; dr:您正在寻找的正则表达式模式是: '(\+.*)(?=\@)'

说明:

首先,写一个与文字"+"符号和任何单个字符匹配的正则表达式,任意次:

'(\+.*)'
Run Code Online (Sandbox Code Playgroud)

用空字符串替换此模式时,将tristan+some_filter@example.org变为tristan.如果您决定拆分@符号,请将结果字符串连接到'@'+ domain.TLD,然后您就完成了.我提到这个,以防你已经拆分了电子邮件地址,而且它只是闲逛.

如果你没有在@符号上拆分用户电子邮件地址,你需要使用"积极的预测"(如果我指定这个东西,则匹配此模式)告诉你的匹配什么时候停止(所以我们不要带走太多):

'(\+.*)(?=\@)'
Run Code Online (Sandbox Code Playgroud)

有了这个,我们得到tristan@example.org.万岁,实际上并不那么粗糙.


[0]:在我的一个应用程序中,我存储了用户为我提供通信的原始过滤器电子邮件地址,但跟踪过滤器使用情况并将规范帐户(内部引用)视为没有过滤器的版本(例如user_email@gmail.com).我这样做是为了让选择通过电子邮件地址定位的用户更容易相互搜索.

我理解为什么人们使用别名/过滤器:

  • 他们给出了可以用来跟踪垃圾邮件发送者的错觉(好像电子邮件收集者在销售清单之前不会删除过滤器)
  • 它们在路由电子邮件或触发事件时非常有用(例如,当您收到来自me+package_delivery@domain.tld的电子邮件时发送文本)
  • "我能做到这一点吗?" 因子

这就是说,"我得到它,人们喜欢过滤器",但作为应用程序作者或公司有正当理由来记录它们.

  • 编辑:哇,为什么要downvote?这是一个正则表达式问题,现在它有一个有效的答案. (3认同)

小智 5

我写了一个函数php,我现在也用它来做这个:

function unalias_gmail($email) {
    return preg_replace('/(\+[^\@]+)/', '', $email);
}
Run Code Online (Sandbox Code Playgroud)

如果有别名,这将返回没有别名的电子邮件地址,如果没有别名,则返回给定的电子邮件地址。我有一个用于 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

给我一个快乐OK (4 tests, 4 assertions)=]

注意:如果他们开始允许域中的加号,这将需要一些爱!