我正在使用PHP开发电子邮件验证正则表达式,我需要知道TLD可能有效且仍然有效的时间。我进行了几次搜索,但找不到关于该主题的太多信息。那么一个TLD可能会持续多久?
我正在使用PHP开发电子邮件验证正则表达式,我需要知道TLD可能有效且仍然有效的时间。我进行了几次搜索,但找不到关于该主题的太多信息。那么一个TLD可能会持续多久?
Answers:
DNS允许单个标签最多包含63个字符。
当前存在的最长TLD为24个字符长,并可能会更改。RFC 1034指定的最大TLD长度为63个八位位组。
要获取现有最长TLD的长度,请执行以下操作:
wget -qO - http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L
该命令的作用如下:
curl
感谢Stefan的替代使用:
curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L
curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L
wc -L
还是很容易移植的,尽管编写包含AWK功能的Awk脚本很容易tail -n+2 | wc -L
。例如awk 'NR>1{ if (length($0) < max) next; longest=$0; max=length($0)} END { print max, longest }'
,作为额外的奖励,它还会显示最长的TLD(如果有多个相同长度的标签,则仅打印第一个TLD)。还是24XN--VERMGENSBERATUNG-PWB
岁,又名.vermögensberatung
。快速检查起来更容易键入的是awk 'NR>1 && length($0)>23'
-编辑-
根据RFC 2606,.localhost为保留域名,其长度为9个字符。那是我所知道的最长的。
-编辑结束-
但是,我认为您应该关心电子邮件地址的长度,而不仅仅是TLD的长度。下面是从报价这个文章。电子邮件地址长度为254个字符:
最大有效电子邮件地址大小似乎有些混乱。大多数人认为它是320个字符(用户名64个字符+域255个字符+ @符号1个字符)。其他来源建议使用129(64 + 1 + 64)或384(128 + 1 + 255,假设用户名将来会加倍)。
这种混淆意味着您在编写处理与之相关的软件时应注意“健壮性原则”(“开发人员应认真编写与现有RFC紧密结合但接受并解析来自同等RFC的同行输入的软件。”- Wikipedia)。电子邮件地址。此外,某些软件可能会由于幼稚的假设而瘫痪,例如认为50个字符就足够了(示例)。您的200个字符的电子邮件地址在技术上可能是有效的,但是如果大多数网站或应用程序拒绝该地址,则对您没有帮助。
实际的最大电子邮件长度当前为254个字符:
“ RFC 3696的原始版本确实确实说过320是最大长度,但是约翰·克兰辛(ICANN)随后接受了这一说法是错误的。”
“这产生从邮箱的结构域(255个字符)+最大长度的最大长度的简单的算术运算(64个字符)+ @符号= 320个字符,错误的,这鸭翼是在原始版本实际上记录RFC3696,它已在勘误表中更正。RFC5321实际上对256个字符的SMTP交易的路径元素有一个限制。但这包括电子邮件地址周围的尖括号,因此电子邮件地址的最大长度为254个字符。”
something@random.adskjnadskbjads
。
.localhost
和朋友可能不应该显示在有效的电子邮件地址中。我认为这就是验证的目的。
由于我是.net开发人员,因此以下是确定当前可用的最长TLD的Java脚本表示形式,这将返回您可以在RegEx中使用的最长TLD的长度。
请尝试以下代码片段
function getTLD() {
var length = 0;
var longest;
var request = new XMLHttpRequest();
request.open('GET', 'http://data.iana.org/TLD/tlds-alpha-by-domain.txt', true);
request.send(null);
request.onreadystatechange = function () {
if (request.readyState === 4 && request.status === 200) {
var type = request.getResponseHeader('Content-Type');
if (type.indexOf("text") !== 1) {
var tldArr = request.responseText.split('\n');
tldArr.splice(0, 1);
for (var i = 0; i < tldArr.length; i++) {
if (tldArr[i].length > length) {
length = tldArr[i].length;
longest = tldArr[i];
}
}
console.log("Longest >> " + longest + " >> " + length);
return length;
}
}
}
}
<button onclick="getTLD()">Get TLD</button>
这是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('|');
?>
要匹配主机名,可以这样使用:
$tlds=getTLDs('|');
if (preg_match("{([\da-z\.-]+)\.($tlds)}u",$address)) {
..
}
TLD可以是任何长度。新的TLD一直在发生。将来,将会有更多不受当前规范大多数TLD的实体监管的TLD。我们将来也不会像现在那样使用电子邮件。说:
您无需验证电子邮件地址。如果您想让人们放慢脚步,并且对他们是否真正的人有一个想法,请添加一个验证码。如果您需要确认正常工作的电子邮件,请发送一封带有验证链接的电子邮件,他们可以打开该验证链接。如果您不限制提交的内容(例如可以发送电子邮件以进行验证的东西),则无论您是否确认该地址在技术上都是有效的,无论何时该地址都将被滥用。