Удалите субдомен из строки в рубине

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

7
задан the Tin Man 6 November 2012 в 03:39
поделиться

5 ответов

Обнаружение поддомена URL-адреса в общем смысле нетривиально - это легко, если вы просто рассмотрите базовые, но как только вы попадете на международную территорию, это становится сложно.

Изменить : Подумайте такие вещи, как http://mylocalschool.k12.oh.us и др.

1
ответ дан 6 December 2019 в 04:54
поделиться

Примерно так:

def remove_subdomain(host)
    # Not complete. Add all root domain to regexp
    host.sub(/.*?([^.]+(\.com|\.co\.uk|\.uk|\.nl))$/, "\\1")
end

puts remove_subdomain("www.example.com") # -> example.com
puts remove_subdomain("www.company.co.uk") # -> company.co.uk
puts remove_subdomain("www.sub.domain.nl") # -> domain.nl

Вам все равно нужно добавить все (корневые) домены, которые вы считаете корневыми. Таким образом, '.uk' может быть корневым доменом, но вы, вероятно, захотите оставить хост непосредственно перед частью '.co.uk'.

2
ответ дан 6 December 2019 в 04:54
поделиться

Регулярное выражение, которое вам здесь понадобится, может быть немного сложным, потому что имена хостов могут быть бесконечно сложными - у вас может быть несколько поддоменов (например, foo.bar.baz.com), или домен верхнего уровня (TLD) может состоять из нескольких частей (например, www.baz.co.uk).

Готовы к сложному регулярному выражению? :)

re = /^(?:(?>[a-z0-9-]*\.)+?|)([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$/i
new_url = o_url.host.gsub(re, '\1').strip

Разобьем это на два раздела. ^ (?: (?> [A-z0-9 -] * \.) +? |) будет собирать субдомены, сопоставляя одну или несколько групп символов, за которыми следует точка (жадно, чтобы здесь сопоставляются все поддомены). Пустое чередование необходимо в случае отсутствия поддомена (например, foo.com). ([a-z0-9 -] + \. (?> [Az] * (?> \. [Az] {2})?)) $ соберет фактическое имя хоста и TLD. Это позволяет использовать либо односоставный TLD (например, .info, .com или .museum),

3
ответ дан 6 December 2019 в 04:54
поделиться

Это непростой вопрос. Некоторые домены верхнего уровня не принимают регистрацию на втором уровне.

Сравните example.com и example.co.uk . Если вы просто удалите все, кроме двух последних доменов, вы получите example.com и co.uk , что никогда не может быть намерением.

Firefox решает эту проблему. это путем фильтрации по эффективному домену верхнего уровня , и они поддерживают список всех этих доменов . Дополнительная информация на publicsuffix.org .

Вы можете использовать этот список, чтобы отфильтровать все, кроме домена справа рядом с действующим TLD. Я не знаю ни одной библиотеки Ruby, которая бы это сделала, но было бы неплохо выпустить ее!

Обновление : есть C, Библиотеки Perl и PHP , которые это делают. Учитывая версию C, вы можете создать расширение Ruby. Как вариант, вы можете перенести код на Ruby.

6
ответ дан 6 December 2019 в 04:54
поделиться

Я только что написал для этого библиотеку под названием Domainatrix. Вы можете найти его здесь: http://github.com/pauldix/domainatrix

require 'rubygems'
require 'domainatrix'

url = Domainatrix.parse("http://www.pauldix.net")
url.public_suffix       # => "net"
url.domain    # => "pauldix"
url.canonical # => "net.pauldix"

url = Domainatrix.parse("http://foo.bar.pauldix.co.uk/asdf.html?q=arg")
url.public_suffix       # => "co.uk"
url.domain    # => "pauldix"
url.subdomain # => "foo.bar"
url.path      # => "/asdf.html?q=arg"
url.canonical # => "uk.co.pauldix.bar.foo/asdf.html?q=arg"
29
ответ дан 6 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: