regex 正则表达式匹配电子邮件地址和常见的混淆

oxiaedzo  于 2023-05-08  发布在  其他
关注(0)|答案(4)|浏览(130)

我想知道是否有人有一个好的正则表达式来匹配电子邮件地址,加上常见的混淆方法,例如“joe [at] foo [dot] com”。我并不是在寻找一个完全符合RFC的超级正则表达式。例如,以下内容基本足够好:

^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$

我只需要调整它的最常见的方式来混淆电子邮件地址。是的,我知道有些人会智胜它,并找到一种方法来混淆他们的电子邮件地址的方式,正则表达式不会匹配,但我不担心这些情况。
编辑:请阅读整个问题。我不是在问验证电子邮件地址的问题。我知道网上有成千上万的帖子。我专门研究如何检测混淆的电子邮件地址。

50few1ms

50few1ms1#

不如这样做吧:

^[A-Z0-9\._%+-]+(@|\s*\[\s*at\s*\]\s*)[A-Z0-9\.-]+(\.|\s*\[\s*dot\s*\]\s*)[a-z]{2,6}$

下面是它在工作中的一个例子:http://regexr.com?2uh92
简而言之,它基本上使用方括号在@.分隔符处生成选项组。您可以很容易地插入(\[|\()而不是括号,使它们可以选择使用括号,这将匹配类似hi_there (at) gmail (dot) com的内容。

rmbxnbpk

rmbxnbpk2#

我从@Nightfirecat那里拿来了原始脚本,并对其进行了一些改进,因为它无法与ie匹配。这些电子邮件:

domain.com
联系{@} guardian [dot] co [dot] uk
hello [@] jazzit(dot)hr

下面是正则表达式的改进版本:

[A-Z0-9\._%+-]+(\s*@\s*|\s*[\[|\{|\(]+\s*(at|@)\s*[\)|\}\]]+\s*)([A-Z0-9\.-]+(\.|\s*[\[|\{|\(]+\s*(dot|\.)\s*[\)|\}|\]]+\s*))+[a-z]{2,6}

Demo(或here-非闪存)

2nbm6dog

2nbm6dog3#

这是基于Nightfirecat的回答。以下正则表达式将匹配电子邮件地址和文本中的常见模糊处理***:

[A-Z0-9\._%+-]+(?:\s*@\s*|\s*\[*\s*at\s*\]*\s*)+[A-Z0-9\.-]+(?:\s*\.\s*|\s*\[*\s*dot\s*\]*\s*)[a-z]{2,6}

当以下任何一项在文本字符串中时,这将查找匹配项:

obfuscated_emails = [
  "moo@doo.com",
  "m_oo@doo.co.uk",
  "moo @@ doo.com",
  "moo @ doo . com",
  "moo @ doo.com",
  "moo@doo . com",
  "moo@doo . co . uk",
  "moo@doo. co. uk",
  "m_oo @ doo.com",
  "moo [at] doo.com",
  "moo [at] doo . com",
  "moo [at] doo [dot] com",
  "m_oo [at] doo [dot] co [dot] uk",
  "moo at doo.com",
  "moo at doo . co . uk",
  "m_oo at doo . com",
  "moo at doo dot com"
]

如果你不需要或不想匹配文本中的混淆电子邮件地址***,只需替换开头的“^”和结尾的“$”(或在Rails中使用\A和\z)。
我用这个来确保用户不把电子邮件地址放在不属于它的文本中(或者在他们这样做时警告他们)。他们被提示在其他地方输入。

nwo49xxi

nwo49xxi4#

正如这个答案所解释的,按照RFC 5322规范检测有效邮件地址的正确模式是:

#!/usr/bin/env perl
use v5.10;

$rfc5322 = qr{

   (?(DEFINE)

     (?<address>         (?&mailbox) | (?&group))
     (?<mailbox>         (?&name_addr) | (?&addr_spec))
     (?<name_addr>       (?&display_name)? (?&angle_addr))
     (?<angle_addr>      (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
     (?<group>           (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ; (?&CFWS)?)
     (?<display_name>    (?&phrase))
     (?<mailbox_list>    (?&mailbox) (?: , (?&mailbox))*)

     (?<addr_spec>       (?&local_part) \@ (?&domain))
     (?<local_part>      (?&dot_atom) | (?&quoted_string))
     (?<domain>          (?&dot_atom) | (?&domain_literal))
     (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                   \] (?&CFWS)?)
     (?<dcontent>        (?&dtext) | (?&quoted_pair))
     (?<dtext>           (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])

     (?<atext>           (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
     (?<atom>            (?&CFWS)? (?&atext)+ (?&CFWS)?)
     (?<dot_atom>        (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
     (?<dot_atom_text>   (?&atext)+ (?: \. (?&atext)+)*)

     (?<text>            [\x01-\x09\x0b\x0c\x0e-\x7f])
     (?<quoted_pair>     \\ (?&text))

     (?<qtext>           (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
     (?<qcontent>        (?&qtext) | (?&quoted_pair))
     (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                          (?&FWS)? (?&DQUOTE) (?&CFWS)?)

     (?<word>            (?&atom) | (?&quoted_string))
     (?<phrase>          (?&word)+)

     # Folding white space
     (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
     (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
     (?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment))
     (?<comment>         \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
     (?<CFWS>            (?: (?&FWS)? (?&comment))*
                         (?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

     # No whitespace control
     (?<NO_WS_CTL>       [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])

     (?<ALPHA>           [A-Za-z])
     (?<DIGIT>           [0-9])
     (?<CRLF>            \x0d \x0a)
     (?<DQUOTE>          ")
     (?<WSP>             [\x20\x09])
   )

   (?&address)

}x;

粘糊糊的小东西

请注意,(?&comment)产生是完全递归的,这是RFC 5322规范。如果你使用的是一个玩具正则表达式引擎,它不能处理模式中的递归,那么你将无法编写一个正则表达式,它将不能正确地匹配RFC 5322中的邮件地址。

相关问题