20

假设我有一个这样的字符串:"http://something.example.com/directory/"

我想要做的是解析这个字符串,并"something"从字符串中提取。

第一步,显然是检查以确保字符串包含"http://"- 否则,它应该忽略该字符串。

但是,我该如何提取该"something"字符串中的?假设这将评估的所有字符串都将具有类似的结构(即,我正在尝试提取 URL 的子域 - 如果正在检查的字符串确实是有效的 URL - 其中 valid 以 开头"http://")。

谢谢。

PS 我知道如何检查第一部分,即我可以简单地在 处拆分字符串,"http://"但这并不能解决全部问题,因为这会产生"http://something.example.com/directory/". 我想要的只是"something",没有别的。

4

4 回答 4

36

我会这样做:

require 'uri'

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

URI内置在 Ruby 中。它不是功能最齐全的,但对于大多数 URL 来说,它有足够的能力完成这项任务。如果您有IRI,请查看Addressable::URI

于 2012-11-06T03:13:07.820 回答
8

你可以使用 URI 之类的

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

然后你就可以在主机上工作了。或者从ruby​​ 中的字符串中删除子域中
有一个 gemdomainatrix

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"

你可以只使用子域。

于 2012-11-06T02:39:28.580 回答
2

好吧,你可以使用正则表达式。类似的东西/http:\/\/([^\.]+)/,也就是第一组非'.' 之后的字母http

查看http://rubular.com/。您也可以针对一组测试来测试您的正则表达式,这对于学习这个工具非常有用。

于 2012-11-06T01:49:33.177 回答
1

使用 URI.parse 你可以得到:

require "uri"

uri = URI.parse("http://localhost:3000")
uri.scheme # http
uri.host # localhost
uri.port # 3000
于 2020-07-19T12:10:30.363 回答