我有一个我需要过滤特定域和子域的 url 列表。说我有一些域名,比如
http://www.example.com
http://test.example.com
http://test2.example.com
我需要从域 example.com 中提取 url。
我有一个我需要过滤特定域和子域的 url 列表。说我有一些域名,比如
http://www.example.com
http://test.example.com
http://test2.example.com
我需要从域 example.com 中提取 url。
我了解您可能正在寻找使用 URL 类或其他东西的奇特解决方案,但这不是必需的。只需想一种从每个 url 中提取“example.com”的方法。
注意:example.com 与 example.net 本质上是不同的域。因此,仅提取“示例”在技术上是错误的做法。
我们可以划分一个示例 url 说:
http://sub.example.com/page1.html
第 1 步:使用分隔符“/”拆分 url,以提取包含域的部分。
每个这样的部分都可以以以下块的形式查看(可能为空)
[www][subdomain][basedomain]
第 2 步:丢弃“www”(如果存在)。我们剩下 [subdomain] [basedomain]
第 3 步:使用分隔符“.”分割字符串
第 4 步:查找拆分生成的字符串总数。如果有 2 个字符串,它们都是目标域(example 和 com)。如果有 >=3 个字符串,则获取最后 3 个字符串。如果最后一个字符串的长度为 3,则最后 2 个字符串构成域(example 和 com)。如果最后一个字符串的长度为 2,则最后 3 个字符串组成域(example 和 co 和 uk)
我认为这应该可以解决问题(我希望这不是家庭作业:D)
//You may clean this method to make it more optimum / better
private String getRootDomain(String url){
String[] domainKeys = url.split("/")[2].split("\\.");
int length = domainKeys.length;
int dummy = domainKeys[0].equals("www")?1:0;
if(length-dummy == 2)
return domainKeys[length-2] + "." + domainKeys[length-1];
else{
if(domainKeys[length-1].length == 2) {
return domainKeys[length-3] + "." + domainKeys[length-2] + "." + domainKeys[length-1];
}
else{
return domainKeys[length-2] + "." + domainKeys[length-1];
}
}
}
处理需要我确定两个 URL 是否来自同一个子域的项目(即使存在嵌套域)。我从上面的指南中进行了修改。到目前为止,这很好:
public static boolean isOneSubdomainOfTheOther(String a, String b) {
try {
URL first = new URL(a);
String firstHost = first.getHost();
firstHost = firstHost.startsWith("www.") ? firstHost.substring(4) : firstHost;
URL second = new URL(b);
String secondHost = second.getHost();
secondHost = secondHost.startsWith("www.") ? secondHost.substring(4) : secondHost;
/*
Test if one is a substring of the other
*/
if (firstHost.contains(secondHost) || secondHost.contains(firstHost)) {
String[] firstPieces = firstHost.split("\\.");
String[] secondPieces = secondHost.split("\\.");
String[] longerHost = {""};
String[] shorterHost = {""};
if (firstPieces.length >= secondPieces.length) {
longerHost = firstPieces;
shorterHost = secondPieces;
} else {
longerHost = secondPieces;
shorterHost = firstPieces;
}
//int longLength = longURL.length;
int minLength = shorterHost.length;
int i = 1;
/*
Compare from the tail of both host and work backwards
*/
while (minLength > 0) {
String tail1 = longerHost[longerHost.length - i];
String tail2 = shorterHost[shorterHost.length - i];
if (tail1.equalsIgnoreCase(tail2)) {
//move up one place to the left
minLength--;
} else {
//domains do not match
return false;
}
i++;
}
if (minLength == 0) //shorter host exhausted. Is a sub domain
return true;
}
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
return false;
}
图我把它留在这里,以备将来参考类似的问题。