我正在尝试创建一个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] 删除。
我来说两句