Как долго может длиться ДВУ? - PullRequest
66 голосов
/ 11 февраля 2012

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

Ответы [ 5 ]

63 голосов
/ 11 февраля 2012

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

57 голосов
/ 26 февраля 2014

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

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

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

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

  1. Получите последний список существующих доменов верхнего уровня из IANA
  2. Удалите первую строку, которая является длинным комментарием
  3. Запуск wc для подсчета самой длинной строки

Альтернативное использование curl благодаря Стефану:

curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt | tail -n+2 | wc -L
8 голосов
/ 11 февраля 2012

-EDIT-

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

-END ИЗМЕНЕНИЯ-

Тем не менее, я думаю, что вы должны заботиться о длине адреса электронной почты, а не только о длине 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 символа. "

7 голосов
/ 11 февраля 2012

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

0 голосов
/ 29 января 2017

Это код 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)) {
  ..
}
...