给定一个URL,我想提取域名(它不应包含“ www”部分)。网址可以包含http / https。这是我编写的Java代码。尽管它似乎运行良好,但是有没有更好的方法或有一些极端的情况可能会失败。
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.URI。 java.net.URL有很多问题-它的equals方法进行DNS查找,这意味着与不可信输入一起使用时,使用它的代码可能容易受到拒绝服务攻击的攻击。
“戈斯林先生-为什么要使网址等于糟透了?” 解释了一个这样的问题。只是养成使用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
http
HTTP://example.com/
//example.com/
www/foo
www
wwwexample.com
www.
分层URL具有复杂的语法。如果你尝试不仔细阅读RFC 3986而推出自己的解析器,则可能会弄错。只需使用核心库中内置的一个即可。
如果你确实需要处理java.net.URI拒绝的混乱输入,请参阅RFC 3986附录B:
java.net.URI
附录B.使用正则表达式解析URI引用 由于“首次匹配获胜”算法与POSIX正则表达式使用的“贪婪”消歧方法相同,因此使用正则表达式解析URI引用的潜在五个组成部分是自然而普遍的。
下一行是用于将格式正确的URI引用分解为其组件的正则表达式。
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9
上面第二行中的数字仅用于增强可读性。它们指示每个子表达式(即,每个成对的括号)的参考点。