2012-02-11 70 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)) { 
    .. 
}