从 URL 获取域/主机名的最快方法是什么?

2022-09-02 11:30:45

我需要浏览一个大的字符串URL列表,并从中提取域名。

例如:

http://www.stackoverflow.com/questions 将提取 www.stackoverflow.com

我最初使用的是URL对象初始化,但为该过程增加了大量时间,似乎不需要。new URL(theUrlString).getHost()

有没有一种更快的方法来提取主机名,这将是一样可靠的?

谢谢

编辑:我的错误,是的,www。将包含在上面的域名示例中。此外,这些网址可能是http或https


答案 1

如果你想处理等,我建议你做这样的事情:https

int slashslash = url.indexOf("//") + 2;
domain = url.substring(slashslash, url.indexOf('/', slashslash));

请注意,这包括实际上是域名一部分的部分(就像这样做一样)。wwwURL.getHost()

通过注释编辑请求

以下是可能有帮助的两种方法:

/**
 * Will take a url such as http://www.stackoverflow.com and return www.stackoverflow.com
 * 
 * @param url
 * @return
 */
public static String getHost(String url){
    if(url == null || url.length() == 0)
        return "";

    int doubleslash = url.indexOf("//");
    if(doubleslash == -1)
        doubleslash = 0;
    else
        doubleslash += 2;

    int end = url.indexOf('/', doubleslash);
    end = end >= 0 ? end : url.length();

    int port = url.indexOf(':', doubleslash);
    end = (port > 0 && port < end) ? port : end;

    return url.substring(doubleslash, end);
}


/**  Based on : http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/webkit/CookieManager.java#CookieManager.getBaseDomain%28java.lang.String%29
 * Get the base domain for a given host or url. E.g. mail.google.com will return google.com
 * @param host 
 * @return 
 */
public static String getBaseDomain(String url) {
    String host = getHost(url);

    int startIndex = 0;
    int nextIndex = host.indexOf('.');
    int lastIndex = host.lastIndexOf('.');
    while (nextIndex < lastIndex) {
        startIndex = nextIndex + 1;
        nextIndex = host.indexOf('.', startIndex);
    }
    if (startIndex > 0) {
        return host.substring(startIndex);
    } else {
        return host;
    }
}

答案 2

您希望在实现“快速”方式取消选择URL时要相当小心。URL 中存在许多潜在的可变性,可能导致“快速”方法失败。例如:

  • 方案(协议)部分可以写成大写和小写字母的任意组合;例如,“http”,“Http”和“HTTP”是等价的。

  • 授权部分可以任选地包括用户名和/或端口号,如“http://you@example.com:8080/index.html”。

  • 由于 DNS 不区分大小写,因此 URL 的主机名部分也(实际上)不区分大小写。

  • 在 URL 的方案或颁发机构组件中对未保留字符进行 %编码是合法的(尽管是非常不规则的)。在匹配(或剥离)方案或解释主机名时,您需要考虑到这一点。将包含 %编码字符的主机名定义为等效于解码了 % 编码序列的主机名。

现在,如果您完全控制了生成要剥离的URL的过程,则可以忽略这些细节。但是,如果它们是从文档或网页中收集的,或者由人类输入的,那么建议您考虑一下,如果您的代码遇到“不寻常”的URL,会发生什么。


如果您关心的是构造 URL 对象所花费的时间,请考虑改用 URI 对象。在其他好处中,URI 对象不会尝试对主机名部分进行 DNS 查找。