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

拉斐尔75

我正在尝试创建一个PHP PCRE正则表达式,它(几乎)与RFC5321和5322完全兼容,以测试电子邮件地址我唯一不需要的是(注释)部分。我在这里已经看到了其他一些尝试,但是当我对它们进行测试时,它们并不能全部工作。

我一直在研究一个非常接近的东西:

 ^(([\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-将在其他地方处理)

   (\[\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\])

或ipv6

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

)

它唯一缺少的是能够检查引用的局部部分之外的多个连续的。(句点)。使用自己的一些测试以及有关电子邮件地址Wikipedia文章上的测试,分别在regex101.com和以下所有地址上进行了测试

[email protected]
[email protected]
[email protected]
[email protected]
[email protected] <-DOES NOT VALIDATE CORRECTLY - MULTIPLE .'s
bob&[email protected]
"bob..smith"@smith.com

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
admin@mailserver1
[email protected]
" "@example.org
"john..doe"@example.org

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

我尝试使用前瞻性断言和后向断言来测试连续的时间段,但是我无法弄清楚。我认为这是唯一遗漏的内容(除了注释,对于我而言,这不是必需的)。

有没有一种方法可以检查不会改变我目前拥有太多时间的期间,还是需要一种不同的方法?

如果我错过了其他任何事情,请告诉我。

谢谢。

维克多·史翠比维

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

请参阅regex演示

(?!("[^"]*"|[^"])*\.{2})负向前查找失败的比赛,如果,立即到当前位置的右边,有

  • ("[^"]*"|[^"])*-0次或多次出现,"后跟0+个非字符",然后为"或除"
  • \.{2} -两个连续的点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章