2012-02-11 72 views
53

我正在使用PHP的電子郵件驗證正則表達式,我需要知道TLD可能會持續多久,並且仍然有效。我做了一些搜索,但找不到有關該主題的很多信息。 TLD可能會持續多久?頂級域名可能需要多長時間?

+1

你應該閱讀「[?如何使用正則表達式來驗證電子郵件地址](http://stackoverflow.com/questions/201323 /如何使用的-A-正則表達式到驗證-AN-電子郵件地址)」。 – Saxoier 2012-02-11 09:54:42

+1

正如許多相關問題所指出的,正則表達式的電子郵件驗證最多是可疑的。另見例如http://stackoverflow.com/questions/201323/how-to-use-a-regular-expression-to-validate-an-email-addresses – tripleee 2012-02-11 09:56:31

+3

請,請不要把你自己的解決方案,解決問題。使用PHP的內置驗證或經過良好測試的符合RFC的第三方庫,如['is_email'](http://code.google.com/p/isemail/)。請記住,真正知道電子郵件地址是否有效的唯一方法是向其發送郵件並要求用戶根據郵件內容採取行動。 – Charles 2012-02-12 01:24:18

回答

46

DNS允許爲單個標籤最多包含63個字符。

+10

是64嗎?我在這裏看到63:http://en.wikipedia.org/wiki/Domain_Name_System#cite_ref-rfc1034_1-2我忽略了一個? – 2013-04-02 03:46:02

+2

感謝您的詢問。我不記得在這方面做了大量的研究,所以我當時可能只是搜索了它。我將編輯問題並留下這封感謝信。 – tripleee 2013-04-02 04:10:15

+0

很酷,只要我不會精神上 – 2013-04-02 04:55:06

7

CNC中

根據RFC 2606 .localhost被保留域名和其長度爲9個字符。 這是我知道的最長的。

-END的編輯 -

不過,我認爲你應該關心的電子郵件地址長度,不僅TLD長度。 以下是this文章的引用。 的電子郵件地址長度爲254個字符:

似乎存在超過最大有效的電子郵件地址大小一些混亂。大多數人認爲它是320個字符(用戶名爲64個字符+域名爲255個字符+符號爲1個字符)。其他資料顯示129(64 + 1 + 64)或384(128 + 1 + 255,假設用戶名將來會增加一倍)。 (「開發人員應仔細編寫與現存的RFC密切合作的軟件,但接受並解析來自同行的輸入,這些輸入可能與這些RFC不一致」) - Wikipedia)寫作時處理電子郵件地址的軟件。此外,某些軟件可能會被天真的假設所扼殺,例如認爲50個字符是足夠的(examples)。您的200個字符的電子郵件地址可能在技術上是有效的,但如果大多數網站或應用程序拒絕它,這將無濟於事。

實際的最大長度的電子郵件是目前254個字符:

「的原始版本的RFC 3696確實說320是最大長度,但John Klensin (ICANN)後來接受這是錯誤的。」

「這是由一個域的最大長度(255個字符)+一個郵箱的最大長度(64個字符)+ @個符號= 320個字符的簡單算術計算得到的錯誤,這個鴨子實際上記錄在原始版本中RFC3696,它在勘誤表中得到糾正,實際上有一個限制,從RFC5321到256個字符的SMTP交易的路徑元素,但是這包括電子郵件地址周圍的尖括號,所以電子郵件地址的最大長度是254個字符。 「

+0

這是一個很好的觀點,我已經考慮到了這一點(我之前實際閱讀過這篇文章)。不過,我確實認爲檢查頂級域名的長度以確保某人不只是輸入'something @ random.adskjnadskbjads'是有益的。 – 2012-02-11 07:49:21

+1

根據RFC 2606 .localhost是保留域名,其長度是9個字符 – aviad 2012-02-11 07:55:35

+0

@aviad:但是'.localhost'和朋友應該不會出現在工作電子郵件地址中。我認爲這就是驗證的目的。 – 2012-02-11 07:59:51

7

最長用的拉丁字母是.MUSEUM(source),但也有一些有特殊字符。最長的是XN - CLCHC0EA0B2G2A9GCD。此外,在短時間內,將有可能爲高價保留自己的TLD,因此可能會更長。

47

目前最長的TLD長度爲24個字符,並且可能會有變化。由RFC 1034指定的最大TLD長度爲63個八位字節。

爲了獲得最長的現有TLD的長度:

wget -qO - http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L 

下面是命令的作用:

  1. 獲取latest list of actual existing TLDsIANA
  2. 地帶的第一線,這是一個長期的-ish comment
  3. 啓動wc來算最長的線

使用curl由於斯蒂芬備選:

curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L 
+4

它現在是24 :) 如果你沒有wget這裏是curl另類'curl -s http://data.iana.org/TLD/tlds-alpha -by-domain.txt | tail -n + 2 | wc -L' – 2014-12-18 08:00:07

+5

這不是「它可能會持續多久」的問題的答案 - 它只是當前使用時間最長的答案。 – NickG 2015-07-30 10:04:53

+1

'wc -L'也不是可移植的,但是很容易編寫一個包含'tail -n + 2 | wc -L';例如'awk'NR> 1 {if(length($ 0) 1 && length($ 0)> 23'' – tripleee 2016-01-13 10:57:03

0

這是PHP代碼起牀最新豎線分隔UTF-8的TLD列表直接在正則表達式應用於:

<?php 
    function getTLDs($separator){ 
    $tlds=file('http://data.iana.org/TLD/tlds-alpha-by-domain.txt'); 
    array_shift($tlds); // remove heading comment 
    usort($tlds,function($a,$b){ return strlen($b)-strlen($a); }); // sort from longest to shortest 
    return implode($separator,array_map(function($e){ return idn_to_utf8(trim(strtolower($e))); },$tlds)); 
    } 
    echo getTLDs('|'); 
?> 

你可以在行動here看到它。

要匹配的主機名,你可以使用這樣的:

$tlds=getTLDs('|'); 
if (preg_match("{([\da-z\.-]+)\.($tlds)}u",$address)) { 
    .. 
}