Извлечение TLD имени хоста с помощью регулярного выражения

StackOverflow https://stackoverflow.com/questions/3425355

  •  26-09-2019
  •  | 
  •  

Вопрос

Извлечение точного представления домена верхнего уровня из имени хоста осложняется тем фактом, что каждый реестр доменов верхнего уровня волен составлять свои собственные политики в отношении того, как выдаются домены и какие поддомены определены.Поскольку, по-видимому, нет какого-либо органа по стандартизации, координирующего эти вопросы или устанавливающего стандарты, это сделало определение фактического ДВУ несколько сложным делом.

Поскольку веб-браузеры назначают файлы cookie только зарегистрированным доменам и по соображениям безопасности должны следить за тем, чтобы файлы cookie не могли быть назначены на более широком уровне, эти браузеры обычно содержат базу данных всех известных TLD в той или иной форме.Я обнаружил, что Firefox имеет довольно полную базу данных:

http://hg.mozilla.org/mozilla-central/raw-file/3f91606bd115/netwerk/dns/effective_tld_names.dat

У меня есть два конкретных вопроса:

  • Хотя преобразовать этот список в регулярное выражение довольно тривиально, есть ли драгоценный камень или ссылочное регулярное выражение, которое является лучшим решением, чем создание вашего собственного?Тот Самый дву gem предоставляет информацию только на уровне страны для домена корневого уровня.

  • Есть ли ссылка получше, чем список 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('|') + ')$'
)
Это было полезно?

Решение

Возможно, вы захотите изучить возможность использования Адресуемый чтобы посмотреть, есть ли в этом то, что вам нужно.У него намного больше возможностей, чем библиотека URI Ruby по умолчанию.В частности, вам может помочь его способность создавать шаблоны.

Из документов:

Addressable - это замена реализации URI, которая является частью стандартной библиотеки Ruby.Он более точно соответствует соответствующим RFC и добавляет поддержку шаблонов IRIs и URI.Кроме того, он обеспечивает обширную поддержку шаблонов URI.

С недавним открытием новых TLD это на какое-то время превратится в кошмар.Ознакомьтесь с соответствующим списком справа, чтобы узнать, сколько людей пытаются найти решение. Регулярное выражение для соответствия домену.CCTLD рекомендует использовать функцию, чтобы разбить ее на более мелкие шаги, и это то, что я бы сделал.Попытка сделать это с помощью регулярного выражения предполагает, что вы можете сделать все это в одном выражении, что начинает попахивать использованием регулярного выражения для синтаксического анализа XML или HTML.Цель слишком извилиста для одного шаблона или, по крайней мере, для одного ремонтопригодный закономерность.

В этом ответе упоминается список общедоступных ДВУ.Используя содержащуюся там информацию, вы могли бы быстро использовать Ruby's Regexp.escape и Regexp.union методы создания достаточно хорошего регулярного выражения "на лету".Было бы неплохо, если бы у нас был доступный модуль Regexp::Assembly от Perl, но у нас его нет, поэтому union придется это сделать.(См . "Есть ли эффективный способ выполнить сотни замен текста в Ruby?"ищу способ обойти это.)

Другие советы

Здесь есть еще одна база данных с плоским файлом по адресу http://guava-libraries.googlecode.com/svn-history/r42/trunk/src/com/google/common/net/TldPatterns.java

Возможно, вы могли бы объединить 2 и загрузить их куда-нибудь вроде OData.org, github, sourceforge и т.д.

Есть такой драгоценный камень, который называется публичный-список суффиксов который предоставляет доступ к более формализованной версии списка Mozilla.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top