我刚刚设置了表单的验证,我决定尝试使用filter_var函数来检查我的电子邮件地址的有效性。我无法找到filter_var实际上允许的任何地方(因为文档非常简单),并且我发现它允许像test @ test这样的电子邮件地址。在域中不必有.com,.net等...吗?
回答
行为在四月份左右发生了变化。见bug #49576和revision 297350。
这封电子邮件确实无效,至少这是PHP开发人员所理解的。该人士携带本通知:
/*
* The regex below is based on a regex by Michael Rushton.
* However, it is not identical. I changed it to only consider routeable
* addresses as valid. Michael's regex considers [email protected] a valid address
* which conflicts with section 2.3.5 of RFC 5321 which states that:
*
* Only resolvable, fully-qualified domain names (FQDNs) are permitted
* when domain names are used in SMTP. In other words, names that can
* be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
* in Section 5) are permitted, as are CNAME RRs whose targets can be
* resolved, in turn, to MX or address RRs. Local nicknames or
* unqualified names MUST NOT be used.
的changelog提到的PHP 5.3.3和PHP 5.2.14这个Bug修正。
这个bug的票据被标记为固定的PHP5.3.3和PHP5.2.14 – Gordon 2010-08-04 14:48:24
很棒的Artefacto。所以我认为规则已经改变了?这为什么改变了?我希望他们能解释他们在filter_var文档中检查的内容。那么这会在5.3.3之前返回true,在5.3.3之后会返回false?我使用的系统是5.2.12 – Metropolis 2010-08-04 14:49:31
@Metro它检查电子邮件是否符合Internet标准。 “测试@测试”之前被允许的事实是一个错误。 – Artefacto 2010-08-04 14:52:56
这是一个有效的电子邮件地址。它不会在互联网上工作(至少不是在今天),但是对于本地地址来说,这没问题。
我会假设开发人员正在采取明智的方法来检查电子邮件地址,而不是建立自己的系统,只要引入新的TLD就会保证系统过时。我们有足够的电子邮件地址语法检查程序,拒绝[email protected]
原样。
您是否认为RFC 5321的第2.3.5节不适用? – Artefacto 2010-08-04 14:43:59
不,test
可以是本地/内部网络域,这样就可以工作。我喜欢它在开发时正确验证[email protected]
。
正常的nonexistentdomain.foo
会有同样的问题。如果您想测试是否有东西可以交给主机,请使用getmxrr
(并且它失败时会回退到gethostbyname()
)。
那么最好是允许本地地址?或者,如果我不想允许像test @ test这样的东西,我应该使用getmxrr吗? – Metropolis 2010-08-04 14:41:11
不是使用checkdnsrr检查会更好吗?因为如果他们的服务器关闭了,或者其他的东西,那么getmxrr将返回false。对? – Metropolis 2010-08-04 14:44:25
如果您希望/希望处理这些地址,您将允许本地地址(主要在已知的IP范围内)。你确实可以使用checkdnsrr('hostname','ANY'),对我来说不会发生(尽管检查MX或A记录(如果没有定义MX,应该是后备)将更加可靠:注册的域可能没有A&MX记录,导致它们无法投递)。 checkdnsrr/gethostbyname/getmxrr都使用相同的机制afaik,所以如果DNS服务器关闭或速度慢,它将失败/对所有选项都很慢。 – Wrikken 2010-08-04 15:03:38
test @ test在语法上是有效的。
从RFC 5321:
在电子邮件地址是单独使用一个顶级域的情况下,一个单一的字符串用于没有任何点。
只有在此之后它说:
只有解析,完全限定域名(FQDN)被允许 当域名在SMTP使用。换句话说,可以解析为MX RR或地址(即A或AAAA)RR的名称(如第5节中讨论的 ),因为CNAME RR的目标可以是 ,然后依次解析为MX或地址RR。不得使用本地昵称或 不合格名称。
这并不一定排除只有TLD的域名。事实上,运行下面的代码:
checkdnsrr('ua', 'MX') // Returns true
getmxrr('ua', $array) // Returns true
只TLD-域名(罐)有MX记录和是使用:http://www.to/就是一个例子。下面是一些有效的唯一TLD的域名的电子邮件地址:
文斯@人工智能
保罗@ IO
根@公里
Joost的@ TK
管理员@ TT
hostmaster @ ua
示例电子邮件地址的来源s:Tony Finch – TLDs with MXs
- 1. filter_var的替代方案($ email,FILTER_VALIDATE_EMAIL)
- 2. 为什么'进行测试'和“./test/Test”
- 3. 为什么var test = false在test =!test时变为true?
- 4. Zend_Validate_EmailAddress vs filter_var(...,FILTER_VALIDATE_EMAIL)
- 5. filter_var($ email,FILTER_VALIDATE_EMAIL)如果条件不起作用
- 6. 为什么'test = 6 echo $ test'命令在bash中不起作用?
- 7. `test`指令做了什么?
- 8. 为什么[对象Casper] .test未定义?
- 9. 为什么murano-test-runner与keystone连接?
- 10. 为什么我的Junit-AssertionError-Test失败?
- 11. $$ var ['namedIndex'] ='test'为什么不起作用?
- 12. Selenium test to test cookie
- 13. htaccess;/search /?q = test to/test
- 14. bash中的[test]和[[test]]有什么区别?
- 15. 传统test = method(arg)和test = send(method,arg)有什么区别?
- 16. JQuery:“var test”和“var $ test”之间的区别是什么
- 17. Rails命令有什么区别:--no-test-framework,--skip-test-unit和-T?
- 18. Test t = Test();在C++ 98中会发生什么?
- 19. ($ test)=(@test)之间的差异是多少?和$ test = @test;在Perl中?
- 20. 为什么sha1_hex(“test”)返回的值不同于Digest :: SHA-> sha1_hex(“test”)?
- 21. 找不到“GET/test/information/1/name”的路由:方法不允许(允许:PUT)
- 22. PHP的filter_var FILTER_VALIDATE_EMAIL是否真的有效?
- 23. filter_var($变量,FILTER_VALIDATE_EMAIL)总是产生错误
- 24. 如何允许带有强参数的Rack :: Test :: UploadedFile?
- 25. WCF Test Client有什么变化?
- 26. clean test -P是什么意思?
- 27. Test :: DBIx :: Class的schema.conf是什么样的?
- 28. Joel Test的规范是什么意思?
- 29. 什么是:如果[$ i -nt $ {LOG_DIR_PATH}/test]
- 30. int test [] = new int [0]是什么意思?
从技术上讲,'test'可能是本地网络中的有效主机名,所以我认为它是正确的。 – 2010-08-04 14:26:21
您可以发布您的代码吗? var_dump(filter_var('test @ test。',FILTER_VALIDATE_EMAIL)); 对我而言返回false! – Youssef 2010-08-04 14:31:52
test @ test没有点也返回false – Youssef 2010-08-04 14:33:19