Как долго может быть TLD?


Я работаю над регулярным выражением проверки электронной почты в PHP, и мне нужно знать, как долго TLD может быть и оставаться действительным. Я сделал несколько поисков, но не смог найти много информации по этой теме. Итак, как долго может быть TLD?

5 58

5 ответов:

DNS позволяет использовать не более 63 символов для отдельной метки.

самый длинный TLD в настоящее время существует длиной 24 символа и может быть изменен. Максимальная длина дву, указанная RFC 1034 - это 63 октетов.

чтобы получить длину самого длинного существующего TLD:

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

вот что делает эта команда:

  1. скачать последний список реально существующих дву С IANA
  2. Strip первая строка, которая является длинной-иш комментарий
  3. запуск wc чтобы посчитать самую длинную строку

альтернативы с помощью curl спасибо Стефану:

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

самый длинный с латинскими буквами. музей (источник), но есть некоторые специальные символы. Самый длинный из них-XN--CLCHC0EA0B2G2A9GCD. Кроме того, за короткое время можно будет зарезервировать свой собственный TLD по высокой цене, и поэтому можно будет быть дольше.

- EDIT -

согласно RFC 2606 .localhost-это зарезервированное доменное имя, длина которого составляет 9 символов. Это самое длинное, что я знаю.

- КОНЕЦ РЕДАКТИРОВАНИЯ -

тем не менее, я думаю, что вы должны заботиться о длине адреса электронной почты, а не только о длине TLD. Ниже приведена цитата из этой статьи. Длина адреса электронной почты составляет 254 символа:

там, кажется, есть некоторая путаница по максимальному допустимому адресу электронной почты размер. Большинство людей считают, что это 320 символов (64 символа для имени пользователя + 255 символов для домена + 1 символ для символа@). Другие источники предлагают 129 (64 + 1 + 64 или 384 (128+1+255, предполагая, что имя пользователя удваивается в длину в будущем).

эта путаница означает, что вы должны прислушаться к "принципу надежности" ("разработчики должны тщательно писать программное обеспечение, которое тесно придерживается существующих RFC, но принимает и анализирует входные данные от сверстников, которые могут быть несовместимы с этими РКС."- Википедия) при написании программного обеспечения, которое имеет дело с адресами электронной почты. Кроме того, некоторые программы могут быть искалечены наивными предположениями, например, думая, что 50 символов достаточно (примеры). Ваш 200-символьный адрес электронной почты может быть технически допустимым, но это не поможет вам, если большинство веб-сайтов или приложений отклонят его.

фактическая максимальная длина электронной почты в настоящее время составляет 254 символа:

" The оригинальная версия RFC 3696 действительно сказал 320 была максимальная длина, но Джон Кленсин (ICANN) впоследствии признал, что это было неправильно."

" это происходит из простой арифметики максимальной длины домена (255 символов) + максимальной длины почтового ящика (64 символа) + символ @ = 320 символов. Неправильный. Этот слух фактически задокументирован в оригинальной версии RFC3696. Это было исправлено в опечатках. Есть на самом деле ограничение от RFC5321 на элементе path SMTP-транзакции из 256 символов. Но это включает в себя угловые скобки по адресу электронной почты, поэтому максимальная длина адреса электронной почты составляет 254 символа."

это PHP код, чтобы получить актуальную вертикальную полосу разделены UTF-8 список дву, который будет использоваться непосредственно в регулярном выражении:

<?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)) {
  ..
}