从Justinas 提供的链接中引用更多内容:
电子邮件地址的格式是 local-part@domain ,其中本地部分最长为64 个字符,域最长为 255 个字符——但正向或反向路径的最大 256 个字符长度限制了整个电子邮件地址不得超过 254 个字符。
现在,如果我们查看filter_var
's source,我们会发现那里基本上有两个检查:
- 如果整个电子邮件地址超过 320 个符号
- 如果它匹配正则表达式(除非我们指定
FILTER_FLAG_EMAIL_UNICODE
标志)
正则表达式可以重写如下:
/^
### check if total length is no more than 254 symbols
(?!
(?:
(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)
|
(?:\\x22?[^\\x5C\\x22]\\x22?)
){255,}
)
### check if the part before @ is no more than 64 symbols
(?!
(?:
(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)
|
(?:\\x22?[^\\x5C\\x22]\\x22?)
){65,}
@
)
(?:
(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)
|
(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)
)
(?:
\\.
(?:
(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)
|
(?:
\\x22
(?:
[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]
|
(?:\\x5C[\\x00-\\x7F])
)*
\\x22
)
)
)*
@
(?:
(?:
### no segment must be longer than 64 symbols
(?!.*[^.]{64,})
(?:
(?:
(?:xn--)?
[a-z0-9]+
(?:-+[a-z0-9]+)*
\\.
){1,126}
){1,}
(?:
(?:[a-z][a-z0-9]*)
|
(?:(?:xn--)[a-z0-9]+)
)
(?:-+[a-z0-9]+)*
)
|
### ip
(?:
\\[
(?:
(?:
IPv6:
(?:
(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})
|
(?:
(?!(?:.*[a-f0-9][:\\]]){7,})
(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?
::
(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?
)
)
)
|
(?:
(?:
IPv6:
(?:
(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)
|
(?:
(?!(?:.*[a-f0-9]:){5,})
(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?
::
(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?
)
)
)?
(?:
(?:25[0-5])
|
(?:2[0-4][0-9])
|
(?:1[0-9]{2})
|
(?:[1-9]?[0-9])
)
(?:
\\.
(?:
(?:25[0-5])
|
(?:2[0-4][0-9])
|
(?:1[0-9]{2})
|
(?:[1-9]?[0-9])
)
){3}
)
)
\\]
)
)
$/iD
知道我们能得到的最好的是:
$ php -r 'var_dump(filter_var(str_repeat("a", 64) . "@" . str_repeat(str_repeat("g", 63) . ".", 2) . str_repeat("g", 61), FILTER_VALIDATE_EMAIL));'
Command line code:1:
string(254) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg.ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg.ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"
$ php -r 'var_dump(filter_var(str_repeat("a", 64) . "@" . str_repeat(str_repeat("g", 63) . ".", 2) . str_repeat("g", 62), FILTER_VALIDATE_EMAIL));'
Command line code:1:
bool(false)