Извлечение ДВУ имени хоста с помощью регулярного выражения - PullRequest
0 голосов
/ 06 августа 2010

Извлечение точного представления домена верхнего уровня имени хоста усложняется тем фактом, что каждый реестр доменов верхнего уровня свободен в создании своих собственных политик относительно того, как выдаются домены и какие поддомены определены.Поскольку не существует какого-либо органа по стандартизации, координирующего эти или устанавливающего стандарты, это сделало определение фактического 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('|') + ')$'
)

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

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

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

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

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

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

1 голос
/ 17 февраля 2011

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

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

0 голосов
/ 12 июля 2011

Существует гем под названием public-суффикс-список , который предоставляет доступ к более формализованной версии списка Mozilla.

...