完全兼容RFC5321和5322的PHP PCRE正则表达式

完全兼容RFC5321和5322的PHP PCRE正则表达式,php,regex,email,pcre,Php,Regex,Email,Pcre,我正在尝试创建一个与RFC5321和5322完全兼容的PHP PCRE正则表达式来进行测试。我唯一不需要的是(评论)部分。我在这里看到了一些其他的尝试,但是当我运行测试时,它们并不都起作用 我一直在研究一个非常接近的问题: ^(([\w \!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~\.]{1,64})|("[\w \!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~\.]{1,64}"))@(([\w\-]*\.?[\w\-]*)

我正在尝试创建一个与RFC5321和5322完全兼容的PHP PCRE正则表达式来进行测试。我唯一不需要的是(评论)部分。我在这里看到了一些其他的尝试,但是当我运行测试时,它们并不都起作用

我一直在研究一个非常接近的问题:

 ^(([\w \!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~\.]{1,64})|("[\w \!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~\.]{1,64}"))@(([\w\-]*\.?[\w\-]*)|(\[\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\])|(\[IPv6:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}\]))$
要分解它:

本地部分:

(
最多匹配64个允许的字符

   ([\w \!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~\.]{1,64})
    |
或匹配带引号字符串中的同一组字符:

   ("[\w \!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~\.]{1,64}")
)
结束局部部分

匹配@符号

@
匹配域部分:

(
使用允许的字符匹配域部件:

   ([\w\-]*\.?[\w\-]*)
或ipv4(它不会检查以确保它们小于255-这将在其他地方处理)

还是ipv6

   (\[IPv6:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}\])

)
它唯一缺少的是能够检查引用的本地部分之外的多个连续的“期间”。我使用我自己的一些测试和上的测试对以下所有地址进行了测试:

bob@smith.com
上下快速移动smith@smith.com
鲍勃-smith@smith.com
鲍勃-smith@bob-史密斯网
b0b!-。。。smith@smith.com我推荐你。写一个100%工作的正则表达式是不可能的

我已经编写了一个非正则表达式实现。如果你把它移植到php,并在我的github页面上提交一个问题,或者给我发送一封电子邮件(在我的github页面上列出),我会很高兴地链接到它

正如您可以从中看出的,它足够全面,可以处理EAI地址。

您可以在
^
之后添加
(?!(“[^”]*“|[^”])*.{2}

(?!(“[^”]*“[^”])*\.{2})
如果在当前位置的右侧出现以下情况,则负前瞻将导致匹配失败:

  • (“[^”]*”|[^”]*
    -0次或多次出现
    后接0+字符而不是
    ,然后是
    或任何字符而不是
  • \.{2}
    -两个连续点

尝试在
^
之后添加
(?!(“[^”]*“[^”])*。{2}
。如果您在regex101上进行测试,请使用
(?!(“[^”\n]*“[^”\n])*\。{2}
查看是否完美,谢谢!我觉得现实可能比我想象的更困难。我认为最难的部分是处理EAI的事情。谢谢你的文章和信息!
   (\[IPv6:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}:[\da-fA-F]{0,4}\])

)
bob@smith.com
bob.smith@smith.com
bob-smith@smith.com
bob-smith@bob-smith.com
b0b!-...smith@smith.com <-DOES NOT VALIDATE CORRECTLY - MULTIPLE .'s
bob&smith@smith.com
"bob..smith"@smith.com

simple@example.com
very.common@example.com
disposable.style.email.with+symbol@example.com
other.email-with-hyphen@example.com
fully-qualified-domain@example.com
user.name+tag+sorting@example.com
x@example.com
example-indeed@strange-example.com
admin@mailserver1
example@s.example
" "@example.org
"john..doe"@example.org

Abc.example.com
A@b@c@example.com
a"b(c)d,e:f;g<h>i[j\k]l@example.com
just"not"right@example.com
this is"not\allowed@example.com
this\ still\"not\\allowed@example.com
1234567890123456789012345678901234567890123456789012345678901234+x@example.com
john..doe@example.com  <-DOES NOT VALIDATE CORRECTLY - MULTIPLE .'s
john.doe@example..com