我剛剛設置了表單的驗證,我決定嘗試使用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