我想知道在java中是否有解析器或库用于提取URL中的二级域(SLD) - 或者无法使用算法或正则表达式来执行相同操作.例如:
URI uri = new URI("http://www.mydomain.ltd.uk/blah/some/page.html");
String host = uri.getHost();
System.out.println(host);
Run Code Online (Sandbox Code Playgroud)
打印:
mydomain.ltd.uk
Run Code Online (Sandbox Code Playgroud)
现在我想做的是强有力地识别SLD("ltd.uk")组件.有任何想法吗?
编辑:我理想地寻找一般解决方案,所以我在"police.uk"中匹配".uk",在"bbc.co.uk"中匹配".co.uk",在"amazon"中匹配".com" .COM".
谢谢
use*_*155 15
在这里重复一切后,正确的解决方案应该是(用番石榴)
.InternetDomainName.from(uriHost).topPrivateDomain()的toString();
ZZ *_*der 14
不知道你的目的,但二级域名对你来说意义不大.您可能需要找到公共后缀,并且正下方的域名正是您要找的.
Apache Http Component(HttpClient 4)附带了处理这个问题的类,
org.apache.http.impl.cookie.PublicSuffixFilter
org.apache.http.impl.cookie.PublicSuffixListParser
Run Code Online (Sandbox Code Playgroud)
你需要从这里下载公共后缀列表,
http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
sim*_*905 11
在查看这些答案并且不满意之后,我使用该类com.google.common.net.InternetDomainName从所有部分中减去域名的公共部分:
Set<String> nonePublicDomainParts(String uriHost) {
InternetDomainName fullDomainName = InternetDomainName.from(uriHost);
InternetDomainName publicDomainName = fullDomainName.publicSuffix();
Set<String> nonePublicParts = new HashSet<String>(fullDomainName.parts());
nonePublicParts.removeAll(publicDomainName.parts());
return nonePublicParts;
}
Run Code Online (Sandbox Code Playgroud)
那个类在guava库中的maven上:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>10.0.1</version>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在内部,这个类使用的是TldPatterns.class,它是包私有的,并且包含了顶级域名列表.
有趣的是,如果您在下面的链接中查看该类源,它会明确地将"police.uk"列为私有域名.这是正确的,因为police.uk是一个由警方控制的私人域名; 其他criminals.police.uk将通过电子邮件向您询问有关他们正在进行的卡欺诈调查的信用卡详细信息;)
| 归档时间: |
|
| 查看次数: |
18556 次 |
| 最近记录: |