我的要求是通过过滤出URL的子域名来获得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博客是一个子域,abc是一个域名,我只想知道/打印abc,排除它的子域部分。
在android中,有一个类InternetDomainName返回域名,这是我正在寻找的iOS类似的解决方案。
我尝试了几个答案,这不是重复的,或其中任何一个不起作用,或这是一个解决办法。
发布于 2018-09-20 05:39:27
所以我终于找到了更好、更标准的方法来解决这个问题-
Mozilla志愿者维护公共后缀列表和那里,您可以找到相应语言的库列表。所以在列表中Swift图书馆也是存在的。在编写这个答案时,Swift图书馆没有通过CocoPods添加它的条件,所以您必须将下载的项目直接添加到项目中。假设将Swift图书馆添加到项目中,则获取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尚未可用。
发布于 2018-07-23 10:27:18
这只是一个解决办法,但效果很好:
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)
}
}如果你面临任何问题请告诉我。
发布于 2018-07-23 10:38:44
没有简单的方法,不管语言。有关所涉困难的一些良好讨论,请参见如何从URL中提取顶级域名。
https://stackoverflow.com/questions/51476379
复制相似问题