2012-11-06 21 views
7

że mam ciąg jak poniżej: "http://something.example.com/directory/"Jak analizować URL i wyodrębnić żądany podciąg

Co chcę zrobić to przeanalizować ten ciąg i wyodrębnić "something" z łańcucha.

Pierwszym krokiem jest oczywiście sprawdzenie, czy ciąg zawiera "http://" - w przeciwnym razie powinien zignorować ciąg znaków.

Ale, jak mogę po prostu wyodrębnić "something" w tym ciągu? Załóżmy, że wszystkie ciągi, które będą oceniać, będą miały podobną strukturę (tj. Próbuję wyodrębnić subdomenę adresu URL - jeśli badany ciąg jest rzeczywiście poprawnym adresem URL - gdzie poprawny zaczyna się od "http://").

Dzięki.

P.S. Wiem, jak sprawdzić pierwszą część, tj. Mogę po prostu podzielić ciąg znaków na "http://", ale to nie rozwiązuje całego problemu, ponieważ spowoduje to wygenerowanie "http://something.example.com/directory/". Wszystko, czego chcę, to "something", nic więcej.

+0

http://www.regular-expressions.info/ruby.html – durron597

+1

@ durron597: Nie młotkuj wszystkiego za pomocą wyrażeń regularnych. URL to dobrze zdefiniowany obiekt, traktowany milion razy zarówno w standardowej bibliotece Rubiego, jak iw milionach innych klejnotów. Gdybym był ekspertem, odpowiedziałbym. –

+0

Co ze wszystkimi spadkami? Nie rozumiem tego. – marcamillion

Odpowiedz

18

zrobiłbym to w ten sposób:

require 'uri' 

uri = URI.parse('http://something.example.com/directory/') 
uri.host.split('.').first 
=> "something" 

URI jest wbudowany w Ruby. Nie jest to w pełni wyposażony, ale jest w stanie wykonać to zadanie dla większości adresów URL. Jeśli masz IRIs, spójrz na Addressable::URI.

+0

Uwielbiam to. Ładne, eleganckie i nie drogie. Dzięki! – marcamillion

+1

I to nie wymaga od nas utrzymywania żadnego regexu. –

+0

Tak ... właśnie tego szukałem. Dzięki Meng !!! – marcamillion

2

Cóż, możesz używać wyrażeń regularnych. Coś takiego jak /http:\/\/([^\.]+)/, czyli pierwsza grupa non "." litery po http. Sprawdź http://rubular.com/ można przetestować wyrażeń regularnych w oparciu o zestaw testów też jest świetny do nauki tego narzędzia :)

+1

Zacząłem to robić, ale dość szybko stało się dość niechlujne. – marcamillion

6

można użyć URI jak

uri = URI.parse("http://something.example.com/directory/") 
puts uri.host 
# "something.example.com" 

i można następnie po prostu pracować na gospodarz.
A tam jest skarb domainatrix od Remove subdomain from string in ruby

require 'rubygems' 
require 'domainatrix' 

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" 

i można po prostu wziąć subdomenę.

+0

Myślę, że to dobre ogólne rozwiązanie dla każdego, kto chce analizować wszystkie rodzaje adresów URL. Jednak w moim przypadku wystarczy przeanalizować konkretny format adresu URL, którym jest 'foo.bar/somedir'. – marcamillion

+0

@marcamillion Dlatego też dałem ci pierwszą alternatywę, która jest taka sama, jak odpowiedział Tin Man. – oldergod

+0

@oldergod: Jak dobrze utrzymuje się dominacja? Czy to jest dojrzałe? –

Powiązane problemy