php Regex的电子邮件地址


php Regex on email addresses

试图过滤掉一些特定的电子邮件地址。我运行一个查询,返回如下数据

smtp:email@email.local
X400:C=GB;A= ;P=TRACK;O=Exchange;
SMTP:email@email.com
smtp:Email.4c1f4d8b-8179-4148-93bf-00a95fa1e042@email.com
X400:c=GB;a= ;p=TRACK;o=Exchange;s=Email.4c1f4d8b-8179-4148-93bf-0;
smtp:Email.4c1f4d8b-8179-4148-93bf-00a95fa1e042@email.co.uk
smtp:Email.4c1f4d8b-8179-4148-93bf-00a95fa1e042@email.local
X400:c=GB;a= ;p=TRACK;o=Exchange;s=Mailbox D919BA05-46A6-415;
SMTP:Mailbox{D919BA05-46A6-415f-80AD-7E09334BB852}@email.com
smtp:Mailbox{D919BA05-46A6-415f-80AD-7E09334BB852}@email.co.uk
smtp:Mailbox{D919BA05-46A6-415f-80AD-7E09334BB852}@email.local

我需要返回的是"正常"的电子邮件地址。因此,从上面,我需要返回

smtp:email@email.local
SMTP:email@email.com

首先,我需要删除任何不以smtp/smtp开头的内容。不正常的邮箱地址"@"前有"3"或"-"。我在想我可以用这个来摆脱坏的电子邮件地址。

我尝试过那种方法,但我认为它不是最好的。我有的是

/smtp:'w+(-'w+)?@.*/im
什么是最好的方法把好的电子邮件地址从我的列表中拿出来?

谢谢

看看这在您的实际情况下是否更好:

$pattern = '/smtp:(['w]*?@.*?'.(com|local))$/im';
preg_match_all($pattern, $emails, $matches);
var_dump($matches[1]);

如果你想捕获所有RFC 822兼容的电子邮件地址,考虑使用这个正则表达式:

/smtp:([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|'"(''n|(''''''r)*([^'"''''''r''n]|''''[^''r]))*(''''''r)*'")(''.([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|'"(''n|(''''''r)*([^'"''''''r''n]|''''[^''r]))*(''''''r)*'"))*@([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|''[(''n|(''''''r)*([^][''''''r''n]|''''[^''r]))*(''''''r)*])(''.([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|''[(''n|(''''''r)*([^][''''''r''n]|''''[^''r]))*(''''''r)*]))*/im

这意味着你的代码看起来像这样:

$pattern = "/smtp:([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|'"(''n|(''''''r)*([^'"''''''r''n]|''''[^''r]))*(''''''r)*'")(''.([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|'"(''n|(''''''r)*([^'"''''''r''n]|''''[^''r]))*(''''''r)*'"))*@([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|''[(''n|(''''''r)*([^][''''''r''n]|''''[^''r]))*(''''''r)*])(''.([^][()<>@,;:'''''". ''x00-''x1F''x7F]+|''[(''n|(''''''r)*([^][''''''r''n]|''''[^''r]))*(''''''r)*]))*/im";
preg_match_all($pattern, $emails, $matches);
var_dump($matches[1]);