从URL字符串中提取主机名/域名

10

我有一个像http://hostname:port_no/control/login.jsp这样的URL。

我将上述URL存储在某个字符串中。现在,我需要从该字符串中提取hostname

我在Java代码中这样做:


```java String url = "http://hostname:port_no/control/login.jsp"; URL obj = new URL(url); String hostname = obj.getHost(); ```
String domain = url.substring(url.indexOf('/') + 2, url.lastIndexOf(':'));

我想知道是否有更好的方法来完成相同的事情。


1
你可以尝试使用:URL类进行解析。 - Re Captcha
我请求您将问题的主题更改为“从URL字符串中获取提取的主机名/域名”,请做必要的修改。 - niiraj874u
7个回答

20

你可以使用java.net.URI-类来从字符串中提取主机名。

下面是一个方法,你可以从中提取出你的主机名。

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/...开头,则是无故障的,这将返回“hostname”。

如果给定的url无效(主机名未定义),则返回null。


1
+1,使用URI比仅使用URL更安全(且更好)。 - Hungry Blue Dev

8
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();
}

你可以使用这个方法,也可以使用正则表达式。查找类PatternMatcher - pratikch

7
java.net.URL u = new URL("http://hostname:port_no/control/login.jsp");
System.err.println(u.getHost());

4
System.out.println() 是Java语言中用于将文本输出到控制台的命令。 - akash
2
@MaciejCygan 我相信这是一个_超棒的_ 恶作剧 - Hungry Blue Dev
@ambigram_maker 确实是的 ;) - Maciej Cygan
1
一切都很好,但为什么出现Sys.err?这是方法getHost()的一个有效用例。这是一个示例。 - PeterMmm
最佳答案。谢谢。 - user674669

1

使用正则表达式和分组的解决方案:

    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) 是主机名。


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;
        }
    }

}

以下是测试用例和失败的值。
Domain.java javac Domain.java java Domain
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);
    }
}

0
如果您想要处理字符串,可以尝试以下代码示例:
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];

0

在Java中:

String hostname = url.split("://")[1].split(":")[0];
String portnumber = url.split("://")[1].split(":")[1].split("/")[0];

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接