![](/img/trans.png)
[英]filter_var($email, FILTER_VALIDATE_EMAIL) not working in if condition
[英]Why does filter_var($email, FILTER_VALIDATE_EMAIL) allow test@test?
我剛剛設置了一個表單的驗證,我決定嘗試使用filter_var函數來檢查我的電子郵件地址的有效性。 我無法找到filter_var實際允許的任何地方(因為文檔很簡單),我發現它允許一個像test @ test這樣的電子郵件地址。 在域中是否必須有.com,.net等...
這種行為在四月左右發生了變化。 請參閱錯誤#49576和修訂版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 a@b 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.
更改日志提到了PHP 5.3.3和PHP 5.2.14的此錯誤修復。
這是一個有效的電子郵件地址。 它不會在互聯網上工作(至少,不是今天),但它適用於本地地址。
我認為開發人員正在采取明智的方法來檢查電子郵件地址,而不是建立自己的系統,一旦引入新的TLD,該系統就會保證過時。 我們有足夠的電子郵件地址語法檢查程序,拒絕foo@example.museum
。
test @ test在語法上是有效的。
來自RFC 5321:
如果在電子郵件地址中使用頂級域名,則使用單個字符串而不使用任何點。
只有在這之后它才會說:
在SMTP中使用域名時,僅允許可解析的完全限定域名(FQDN)。 換句話說,允許解析為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域名電子郵件地址:
文斯@ AI
保羅@ IO
根@公里
Joost的@ TK
管理員@ TT
hostmaster @ UA
示例電子郵件地址的來源: Tony Finch - 帶有MX的TLD
不, test
可以是本地/內部網絡域,因此可以工作。 我喜歡它在開發時正確驗證了wrikken@localhost
。
正常的nonexistentdomain.foo
會有同樣的問題。 如果要測試某些東西是否可以被主機getmxrr
,請使用getmxrr
(並且它將失敗回到gethostbyname()
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.