swift 4 中如何获取URL 的顶级域名?
How to get top level domain name of URL in swift 4?
我的要求是通过过滤掉它的子域名来获得 URL 的域名。
我可以使用如下代码获取主机名
if let url = URL(string: "https://blog.abc.in/") {
if let hostName = url.host {
print("host name = \(hostName)") // output is: blog.mobilock.in
}
}
所以这里URLblog是子域,abc是域名,我想know/print 只有 abc 排除其子域部分。
在android里面有一个classInternetDomainName哪个return域名,我正在找的类似的解决方案iOS
我尝试了几个答案,但没有任何答案重复,或者其中一些答案不起作用,或者这是一种解决方法。
Get the domain part of an URL string?
这只是一种解决方法,但效果很好:
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)
}
}
如果您遇到任何问题,请告诉我。
不分语言,没有简单的方法。有关所涉及的困难的一些很好的讨论,请参阅 How to extract top-level domain name (TLD) from URL。
所以最后我找到了解决这个问题的更好的标准方法 -
Mozilla 志愿者维护 Public 后缀列表,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 尚不可用
要获取 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
}
}
}
我的要求是通过过滤掉它的子域名来获得 URL 的域名。
我可以使用如下代码获取主机名
if let url = URL(string: "https://blog.abc.in/") {
if let hostName = url.host {
print("host name = \(hostName)") // output is: blog.mobilock.in
}
}
所以这里URLblog是子域,abc是域名,我想know/print 只有 abc 排除其子域部分。
在android里面有一个classInternetDomainName哪个return域名,我正在找的类似的解决方案iOS
我尝试了几个答案,但没有任何答案重复,或者其中一些答案不起作用,或者这是一种解决方法。
Get the domain part of an URL string?
这只是一种解决方法,但效果很好:
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)
}
}
如果您遇到任何问题,请告诉我。
不分语言,没有简单的方法。有关所涉及的困难的一些很好的讨论,请参阅 How to extract top-level domain name (TLD) from URL。
所以最后我找到了解决这个问题的更好的标准方法 -
Mozilla 志愿者维护 Public 后缀列表,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 尚不可用
要获取 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
}
}
}