[英]Extract host name/domain name from URL string
我有一個像http://hostname:port_no/control/login.jsp
這樣的 URL。
我將上面的 url 存儲在一些字符串中。現在,我需要從字符串中提取hostname
。
我在我的 Java 代碼中這樣做
String domain = url.substring(url.indexOf('/') + 2, url.lastIndexOf(':'));
我想知道是否有更好的方法來做同樣的事情。
您可以使用java.net.URI
-class 從字符串中提取主機名。
下面是一種可以從字符串中提取主機名的方法。
public String getHostName(String url) {
URI uri = new URI(url);
String hostname = uri.getHost();
// to provide faultproof result, check if not null then return only hostname, without www.
if (hostname != null) {
return hostname.startsWith("www.") ? hostname.substring(4) : hostname;
}
return hostname;
}
以上為您提供了主機名,如果您的主機名確實以hostname.com/...
或www.hostname.com/...
開頭,則會以“主機名”返回。
如果給定的url
無效(未定義的主機名),則返回 null。
java.net.URL aURL;
try {
aURL = new java.net.URL("http://example.com:80/docs/");
System.out.println("host = " + aURL.getHost()); //example.com
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
java.net.URL u = new URL("http://hostname:port_no/control/login.jsp");
System.err.println(u.getHost());
如果您想要字符串工作,請嘗試以下代碼示例,
String URL= "http://hostname:port_no/control/login.jsp";
String s_URL[] = ULR.split("//");
String s1 = s_URL[1];
String s2[] = s1.split(":");
String hostname = s2[0];
在 Java 中:
String hostname = url.split("://")[1].split(":")[0];
String portnumber = url.split("://")[1].split(":")[1].split("/")[0];
希望這可以幫助。
@KarelG 的答案是最好的答案,盡管我對某些非標准域有具體問題。 示例問題在下面是自包含的。
對於某些“真實世界”的輸入值,我必須向 URI 方案添加一個檢查,以避免錯誤解析某些地址。 這是更改后的代碼。
import java.net.URI;
import java.net.*;
public class Domain {
public static String getDomainName(String url) {
try {
URI uri = new URI(url);
String domain = uri.getHost();
System.out.println("domain: " + domain);
if (uri.getScheme() != null) {
return domain.startsWith("www.") ? domain.substring(4) : domain;
} else {
return uri.getSchemeSpecificPart();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
下面是失敗的測試用例和值。
域.java javac 域.java java 域
import java.net.URI;
import java.net.*;
import java.io.*;
public class Domain {
public static String longname = "https://www.3dprintingmedia.network/longform/page.html";
public static String name = "www.3dprintingmedia.network";
public static void getDomain(String url) {
try {
URI uri = new URI(url);
String domain = uri.getHost();
System.out.println("protocol: " + uri.getScheme());
System.out.println("path: " + uri.getPath());
System.out.println("name: " + name);
System.out.println("domain: " + domain);
System.out.println(domain.startsWith("www.") ? domain.substring(4) : domain);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println("Parsing domain: " + name);
getDomain(longname);
getDomain(name);
System.exit(0);
}
}
使用正則表達式和組的解決方案:
String pattern = "(\\w*://)([\\w-_.]+)([:\\w\\W]*)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(a);
if (m.find())
{
System.out.println(m.group(0));
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
group(2) 是主機名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.