从给定的url获取域名

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)

给定一个URL,我想提取域名(它不应该包括‘www’部分)。URL可以包含http/https。虽然它看起来很好,但有没有更好的方法,或者有一些边缘的情况,可能会失败。

public static String getDomainName(String url) throws MalformedURLException{
    if(!url.startsWith("http") && !url.startsWith("https")){
         url = "http://" + url;
    }        
    URL netUrl = new URL(url);
    String host = netUrl.getHost();
    if(host.startsWith("www")){
        host = host.substring("www".length()+1);
    }
    return host;
}

投入:http://google.com/blah

产出:Google.com

提问于
用户回答回答于

如果你想分析一个URL,使用java.net.URIjava.net.URL有一堆问题 - 它的equals方法执行DNS查找,这意味着使用它的代码在与不可信输入一起使用时可能容易遭受拒绝服务攻击。

“Gosling先生 - 你为什么让url等于吸?” 解释了这样一个问题。只要养成使用习惯就可以了java.net.URI

public static String getDomainName(String url) throws URISyntaxException {
    URI uri = new URI(url);
    String domain = uri.getHost();
    return domain.startsWith("www.") ? domain.substring(4) : domain;
}

应该做你想做的事情。

虽然它似乎工作正常,有没有更好的方法或有一些边缘案例,可能会失败。

您编写的代码无效的URL有效:

  • httpfoo/bar- 包含以路径组件开头的相对URL http
  • HTTP://example.com/ - 协议不区分大小写。
  • //example.com/ - 协议与主机的相对URL
  • www/foo - 一个以路径组件开头的相对URL www
  • wwwexample.com- 不以开头www.但开头的域名www

分层URL具有复杂的语法。如果您尝试在没有仔细阅读RFC 3986的情况下推出自己的解析器,那么您可能会误解它。只需使用核心库中内置的那个。

如果您确实需要处理java.net.URI拒绝的混乱输入,请参阅RFC 3986附录B:

附录B.使用正则表达式解析URI引用 由于“first-match-wins”算法与POSIX正则表达式使用的“贪婪”消歧方法相同,因此使用正则表达式来解析URI引用的潜在五个组件是很自然和常见的。 以下行是用于将格式正确的URI引用分解为其组件的正则表达式。 ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9 上面第二行的数字只是为了提高可读性; 他们指出每个子表达的参考点(即每个成对的括号)。

用户回答回答于
import java.net.*;
import java.io.*;

public class ParseURL {
  public static void main(String[] args) throws Exception {

    URL aURL = new URL("http://example.com:80/docs/books/tutorial"
                       + "/index.html?name=networking#DOWNLOADING");

    System.out.println("protocol = " + aURL.getProtocol()); //http
    System.out.println("authority = " + aURL.getAuthority()); //example.com:80
    System.out.println("host = " + aURL.getHost()); //example.com
    System.out.println("port = " + aURL.getPort()); //80
    System.out.println("path = " + aURL.getPath()); //  /docs/books/tutorial/index.html
    System.out.println("query = " + aURL.getQuery()); //name=networking
    System.out.println("filename = " + aURL.getFile()); ///docs/books/tutorial/index.html?name=networking
    System.out.println("ref = " + aURL.getRef()); //DOWNLOADING
  }
}

读更多

扫码关注云+社区

领取腾讯云代金券