【问题标题】:How to get top level domain name of URL in swift 4?如何在 swift 4 中获取 URL 的顶级域名?
【发布时间】:2018-12-30 18:19:01
【问题描述】:

我的要求是通过过滤掉它的子域名来获取 URL 的域名。

我可以使用以下代码获取主机名

if let url = URL(string: "https://blog.abc.in/")  {
    if let hostName = url.host  {
         print("host name = \(hostName)") // output is: blog.mobilock.in
    }
 }

所以这里的 URL blog 是一个子域,而 abc 是一个域名,我希望通过排除它来仅了解/打印 abc子域部分。

在android中,有一个类InternetDomainName返回域名,类似的解决方案我正在寻找iOS

我尝试了几个答案,但其中任何一个或一些不工作或这是一种解决方法都不是重复的。

Get the domain part of an URL string?

【问题讨论】:

    标签: ios swift xcode nsurl


    【解决方案1】:

    所以最后我找到了解决这个问题的更好和标准的方法 -

    Mozilla 志愿者维护公共后缀列表和there,您可以找到相应语言的库列表。 所以在列表中Swift library 也存在。 在撰写此答案时Swift library 没有通过 CocoPods 添加它的规定,因此您必须将下载的项目直接添加到您的项目中。假设 Swift library 已添加到您的项目中,获取 TLD 名称的代码。

    import DomainParser
    
    static func getTLD(withSiteURL:String) -> String? {
            do{
                let domainParse = try DomainParser()
                if let publicSuffixName = domainParse.parse(host: withSiteURL)?.publicSuffix {
                    if let domainName = domainParse.parse(host: withSiteURL)?.domain {
    
                        let tldName = domainName.replacingOccurrences(of: publicSuffixName, with: "").replacingOccurrences(of: ".", with: "")
                        print("top level name = \(tldName)")
                        return tldName
                    }
                }
            }catch{
            }
            return nil
        }
    

    将域解析器库添加为项目的子项目,因为此库的 pod 尚不可用

    【讨论】:

      【解决方案2】:

      这只是一种解决方法,但效果很好:

          if let url = URL(string: "https://x.y.z.a.b.blog.mobilock.in/")  {
              if let hostName = url.host  {
                  print("host name = \(hostName)") // output is: x.y.z.a.b.blog.mobilock.in
      
                  let subStrings = hostName.components(separatedBy: ".")
                  var domainName = ""
                  let count = subStrings.count
                  if count > 2 {
                      domainName = subStrings[count - 2] + "." + subStrings[count - 1]
                  } else if count == 2 {
                      domainName = hostName
                  }
                  print(domainName)
              }
          }
      

      如果您遇到任何问题,请告诉我。

      【讨论】:

      • 感谢 priyal,但是这个解决方案可以处理 foo.co.uk 吗,在 url 的末尾有 2 个公共后缀,一个是 .co,第二个是 .uk
      【解决方案3】:

      无论语言如何,都没有简单的方法。请参阅How to extract top-level domain name (TLD) from URL,了解有关所涉及困难的一些很好的讨论。

      【讨论】:

        【解决方案4】:

        要获取 URL 的根域,您可以使用以下 URL 扩展名:

        extension URL {
            var rootDomain: String? {
                guard let hostName = self.host else { return nil }
                let components = hostName.components(separatedBy: ".")
                if components.count > 2 {
                    return components.suffix(2).joined(separator: ".")
                } else {
                    return hostName
                }
            }
        }
        

        【讨论】:

        • 查看我在@priyal 回答的评论,域名不仅仅是有模式,它还是模式数据库,会定期更新
        • @sheshnath 你是对的。顶级域可以有不同的模式,例如 co.uk
        猜你喜欢
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2014-11-14
        • 2014-09-19
        • 2015-08-14
        • 1970-01-01
        • 2011-04-11
        • 2010-10-08
        相关资源
        最近更新 更多