使用正则表达式获取URL的域

时间:2011-07-25 22:28:10

标签: ruby regex string parsing url

我正在尝试获取给定网址的域名。例如,http://www.facebook.com/someuser/将返回facebook.com。给定的URL可以采用以下格式:

  1. https://www.facebook.com/someuser(www。是可选的,但应该被忽略)
  2. www.facebook.com/someuser(http://不是必需的)
  3. facebook.com/someuser
  4. http://someuser.tumblr.com - >这必须只返回tumblr.com
  5. 我写了这个正则表达式:

    /(?: \.|\/{2})(?: www\.)?([^\/]*)/i

    但它没有像我期望的那样起作用。

    我可以部分地这样做:

    1. 使用http://删除https://string.delete "/https?:\/\//i"(如果字符串中存在)。
    2. 使用www.删除string.delete "/www\./i"
    3. 获取匹配的域名/(\w+\.\w+)+/i
    4. 但这不适用于子域名。 用于测试的字符串:

      https://www.facebook.com/username
      http://last.fm/user/username
      www.google.com
      facebook.com/username
      http://sub.tumblr.com/
      sub.tumblr.com
      

      我需要这个以尽可能少的内存和处理海岸。

      有什么想法吗?

6 个答案:

答案 0 :(得分:10)

为什么不直接使用URI类来执行此操作?

URI.parse( your_uri ).host

你已经完成了。

只有一件事,如果在网址的开头没有“http://”或“https://”,则必须添加一个,否则解析方法不会为您提供主机(它将是零)。

答案 1 :(得分:2)

这对我有用:/^h?t?t?p?s?:?\/?\/?w?w?w?\.?(.*\.[A-Z]{2,})+[A-Z\/]/i 它总是只为您提供域名部分 看看它: http://rubular.com/r/0hudnJSgVT

要使用它创建一个这样的方法,我把它放在我的助手中,这样我就可以在视图中访问。

def website_url(website_url)
    if website_url[/^h?t?t?p?s?:?\/?\/?w?w?w?\.?(.*\.[A-Z\/]{2,})$/i]
      website_id = $1
    end

    %Q{http://#{ website_id }}
  end

答案 2 :(得分:1)

它必须是正则表达式吗?你也可以这样做。

require 'uri'
yourURL = URI.parse('https://www.facebook.com/username')
print yourURL.host

答案 3 :(得分:0)

您可以使用此正则表达式:

/(\w+\.\w{2,6})(?:\/|$)/

答案 4 :(得分:0)

如果您真的想使用正则表达式,可以尝试以下方式:

test_string.scan(/\w+\.\w+(?=\/|\s|$)/) { |match| do_stuff_with(match) }

这不会考虑域名,例如something.co.uk,但它会匹配测试字符串中的所有内容。

答案 5 :(得分:0)

我已经通过打开课程技术为我的目的创建了 String 类的函数。

class String
  def to_dn
    return '' if self.blank?
    return self.split('@').last if self.match('@')
    link = self
    link = "http://#{link}" unless link.match(/^(http:\/\/|https:\/\/)/)
    link = URI.parse(URI.encode(link)).host.present? ? URI.parse(URI.encode(link)).host : link.strip
    domain_name = link.sub(/.*?www./,'')
    domain_name = domain_name.match(/[A-Z]+.[A-Z]{2,4}$/i).to_s if domain_name.split('.').length >= 2 && domain_name.match(/[A-Z]+.[A-Z]{2,4}$/i).present?
  end
end

示例:

 1. "https://www.facebook.com/someuser".to_dn = "facebook.com"
 2. "www.facebook.com/someuser".to_dn = "facebook.com"
 3. "facebook.com/someuser".to_dn = "facebook.com"
 4. "http://someuser.tumblr.com".to_dn = "tumblr.com" 
 5. "dc.ads.linkedin.com".to_dn = "linkedin.com" 
 6. 'your_name@domain.com'.to_dn = "domain.com"

它也适用于电子邮件地址(这需要我的目的)。希望它对其他人有用。如果您发现任何错误,请纠正我:)

注意:它不适用于“www.domainname.co.in”。我正在努力:)