Получить доменное имя для любого типа формата URL? - PHP в Ruby - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть функция PHP, которая правильно извлекает имя домена (без какого-либо поддоменов) для любого варианта URL. Я новичок в Ruby и с трудом заставляю его работать:

function get_domain_name( $url )
{
    eregi( "http[s]*://([a-zA-Z0-9.-]*)/?.*", $url, $domain );
    $domain = explode( ".", $domain[1] );

    if ( strlen( end($domain) ) == 2 && ( strlen($domain[count($domain)-2]) == 3 || strlen($domain[count($domain)-2]) == 2 )  )
    {
        # special case domains -- ex: co.uk .in .ca
        return strtolower( $domain[count($domain)-3] . "." . $domain[count($domain)-2] . "." . end( $domain ) );
    }
    else
    {
        # regular .com type domains -- three or more letters
        return strtolower( $domain[count($domain)-2] . "." . end( $domain ) );
    }
}

Есть ли в Rails что-то, что уже делает то же самое?

UPDATE:

Вот что я закончил благодаря @ BenW

 def extract_domain(url)
    if domain = url.match(/^(http:\/\/)*(www.)*([a-zA-Z0-9.-]*)\/?.*/i)
      domain = domain[3].split('.')
      if (domain.last.length == 2) && (domain[-2].length == 3 || domain[-2].length == 2)
        # special case domains -- ex: co.uk .in .ca
        domain[-3..-1].join('.')
      else
        # regular .com type domains -- three or more letters
        domain[-2..-1].join('.')
      end
    end
  end

Он принимает все эти форматы:

http://www2.google.com
www2.google.com
http://www.google.com
http://www.google.co.uk
www.google.com
google.co.uk
http://some.long.ass.subdomain.google.com

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

Использование Адресуемый и использование преимуществ String#slice:

def domain_name(uri)
  Addressable::URI.heuristic_parse(uri, :scheme => "http") \
    .host[/\w+\.\w+(\.\w{2})?\Z/]
end

domain_name("stackoverflow.com") # => stackoverflow.com
domain_name("www.stackoverflow.com") # => stackoverflow.com
domain_name("http://stackoverflow.com") # => stackoverflow.com
domain_name("thing.com.au") # => thing.com.au
domain_name("some.thing.com.au") # => thing.com.au
domain_name("police.gov.uk") # => police.gov.uk
1 голос
/ 16 ноября 2011

Ничто не встроено в библиотеки afaik - но прямой порт прост

 def extract_domain(url)
  require 'uri'
  domain = URI.parse(url).host.split('.')

  raise Exception.new("Invalid host") if domain.length < 2

  if (domain[-1].length == 2) and (domain[-2].length == 3 || domain[-2].length == 2)
    return domain[-3..-1].join('.')
  else
    return domain[-2..-1].join('.')
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...