Извлечение точного представления домена верхнего уровня имени хоста усложняется тем фактом, что каждый реестр доменов верхнего уровня свободен в создании своих собственных политик относительно того, как выдаются домены и какие поддомены определены.Поскольку не существует какого-либо органа по стандартизации, координирующего эти или устанавливающего стандарты, это сделало определение фактического TLD довольно сложным делом.
Поскольку веб-браузеры назначают файлы cookie только зарегистрированным доменам, и по соображениям безопасности должныБудьте бдительны, чтобы гарантировать, что куки не могут быть назначены на более широком уровне, эти браузеры обычно содержат базу данных всех известных TLD в той или иной форме.Я обнаружил, что Firefox имеет довольно полную базу данных:
http://hg.mozilla.org/mozilla-central/raw-file/3f91606bd115/netwerk/dns/effective_tld_names.dat
У меня есть два конкретных вопроса:
Хотя это довольно тривиальночтобы преобразовать этот листинг в регулярное выражение, есть ли гем или справочное регулярное выражение, которое является лучшим решением, чем ваш собственный?Драгоценный камень tld предоставляет информацию только на уровне страны для домена корневого уровня.
Есть ли лучшая ссылка, чем список TLD Firefox?Все локальные сайты Google правильно проанализированы в соответствии с этой спецификацией, но это вряд ли исчерпывающий тест.
Если там ничего нет, кто-нибудь заинтересован в драгоценном камне?что выполняет этот вид операции?Такие вещи должны присутствовать в модуле URI, но, по-видимому, отсутствуют.
Вот мое мнение о преобразовании этого файла в пригодное для использования регулярное выражение в Ruby:
TLD_SPEC = Regexp.new(
'[^\.]+\.(' + %q[
// ***** BEGIN LICENSE BLOCK *****
// ... (Rest of file)
].split(/\n/).collect do |line|
line.sub(%r[//.*], '').sub(/\s+$/, '')
end.reject(&:blank?).collect do |s|
Regexp.escape(s).sub(/^\\\*\\\./, '[^\.]+\.')
end.join('|') + ')$'
)