我有一个网址,例如:
http://www.relevantmagazine.com/life/relationship/blog/23317-pursuing-singleness
并想从中提取相关杂志。
目前我有:
@urlroot = URI.parse(@link.url).host
但它返回www.relevantmagazine.com 任何人都可以帮助我吗?
为此使用 gem 可能有点矫枉过正,但无论如何:有一个名为domainatrix的方便 gem ,可以在处理两个元素顶级域等事务时为您提取站点名称。
url = Domainatrix.parse("http://www.pauldix.net")
url.url # => "http://www.pauldix.net" (the original url)
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"
怎么样
@urlroot = URI.parse(@link.url).host.gsub("www.", "").split(".")[0]
试试这个正则表达式:
regex = %r{http://[w]*[\.]*[^/|$]*}
如果您有以下 url 字符串,它会提供以下内容:
url = 'http://www.google.com/?q=blah'
url.scan(regex) => ["http://www.google.com"]
url = 'http://google.com/?q=blah'
url.scan(regex) => ["http://google.com"]
url = 'http://google.com'
url.scan(regex) => ["http://google.com"]
url = 'http://foo.bar.pauldix.co.uk/asdf.html?q=arg'
url.scan(regex) => ["http://foo.bar.pauldix.co.uk"]
它并不完美,但它会删除除前缀和主机名之外的所有内容。然后,您可以使用其他代码轻松清理前缀,现在您只需要在字符串的开头查找http://
or即可。http://www.
另一个想法是,如果您还要 parse ,您可能需要稍微调整我给您的正则表达式https://
。我希望这可以帮助您入门!
编辑:
我重新阅读了这个问题,并意识到我的回答并没有真正做到你所要求的。我想知道你是否知道你正在解析的 URL 是否有一个固定的格式可能会有所帮助,就像总是有 www。如果是这样,您可以使用正则表达式来提取 url 中第一个和第二个句点之间的所有内容。如果没有,也许您可以调整我的正则表达式,使其成为 / 或 www 之间的所有内容。和第一期。这可能是仅获取没有 www 的站点名称的最简单方法。或 .com 或 .au.uk 等。
修改后的正则表达式:
regex = %r{http://[w]*[\.]*[^\.]*}
url = 'http://foo.bar.pauldix.co.uk/asdf.html?q=arg'
url.scan(regex) => ["http://foo"]
会很奇怪。如果您使用正则表达式的东西,您可能必须逐步清理 url 以提取您想要的部分。
也许你可以把它分开?
URI.parse(@link.url).host.split('.')[1]
请记住,某些注册域可能具有多个注册国家域的组成部分,例如.co.uk
或.co.jp
或.com.au
。
我发现答案的灵感来自 tadman 的答案和另一个问题的答案
@urlroot = URI.parse(item.url).host
@urlroot = @urlroot.start_with?('www.') ? @urlroot[4..-1] : @urlroot
@urlroot = @urlroot.split('.')[0]
第一行获取主机,第二行获取删除 www。如果它们是第一行和第三行,则在下一个点之前获取所有内容。