Ответ 1
DNS допускает максимум 63 символа для отдельной метки.
Я работаю над регулярным выражением проверки подлинности электронной почты на PHP, и мне нужно знать, как долго может быть TLD и по-прежнему действителен. Я сделал несколько поисков, но не смог найти много информации по этой теме. Итак, как долго может быть TLD?
DNS допускает максимум 63 символа для отдельной метки.
Самый длинный TLD в настоящее время составляет 24 символа и может быть изменен. Максимальная длина TLD, указанная RFC 1034, составляет 63 октета.
Чтобы получить длину самого длинного существующего TLD:
wget -qO - http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L
Вот что делает эта команда:
wc
, чтобы считать самую длинную строкуАльтернативное использование curl
благодаря Stefan:
curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L
-Edit -
Согласно RFC 2606.localhost зарезервировано имя домена и его длина составляет 9 символов. Это самый длинный, о котором я знаю.
-END OF EDIT -
Однако, я думаю, что вы должны заботиться о длине адреса электронной почты, а не только о длине 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 в элементе пути транзакции SMTP, состоящем из 256 символов, но это включает скобки вокруг адреса электронной почты, поэтому максимальная длина адреса электронной почты составляет 254 символа."
Самый длинный с латинскими буквами -.MUSEUM(источник), но есть некоторые со специальными символами. Самый длинный из них - XN - CLCHC0EA0B2G2A9GCD. Кроме того, за короткое время можно будет зарезервировать свой собственный TLD по высокой цене, и поэтому будет возможно быть длиннее.
Это код 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)) {
..
}
Поскольку я являюсь разработчиком .net, ниже приводится представление сценария java для определения самого длинного TLD, доступного в настоящее время. Это вернет длину самого длинного TLD, который вы сможете использовать в своем RegEx.
пожалуйста попробуйте следующий фрагмент кода
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>