如何在Java中验证一个字符串是否为有效的URL?

65

如何验证Java中的字符串是否为有效的URL?


1
可能是Java中验证URL的重复问题 - james.garriss
我也在寻找这个解决方案。非常感谢您提出这个问题。 - Saiful Islam
8个回答

74

6
为了明确,只有在未指定协议或发现未知协议时才会抛出MalformedURLException异常。与Apache的UrlValidator不同,不会执行任何其他验证。 - dogbane
1
它实际上还执行其他检查,例如端口号。 - Grodriguez
1
我从javadocs http://download.oracle.com/javase/6/docs/api/java/net/URL.html中引用了这句话。他们没有说明任何其他检查。 - dogbane
2
这就是Javadocs所说的,然而检查是如何执行的(您可以自己尝试,或者如果您愿意,可以查看源代码)。 - Grodriguez
1
@Tommie "192.168.0.1"(不包括http://)不是有效的URL。将其作为参数创建java.net.URL会导致失败,出现java.net.MalformedURLException: no protocol。这是预期的行为,并已记录为此类行为。这里没有误报。 - Grodriguez
显示剩余4条评论

51
你可以使用commons-validator中的UrlValidator。这将使您避免编写需要通过捕获异常来实现逻辑流程的代码,而这通常被认为是一种不好的做法。但在这种情况下,如果您将此功能移动到名为isValidUrl(..)的实用方法中,则我认为这样做是可以的,就像其他人建议的那样。

1
主机名不允许使用下划线。 - Udit Kumawat

19

对于Android,只需添加此行:

boolean isValid = URLUtil.isValidUrl( "your.uri" );

如果缺少方案/前缀(例如“http”),则此方法无法正常工作(例如“stackoverflow.com”),并且使用“ftp”方案/前缀(例如“ftp://127.0.0.1”)也无法正常工作。 - Neph
因此,URL和URI之间的区别。 - Rafa0809
1
我也尝试了其他建议(new URL/new URI),但是 URL 不喜欢没有方案的 URL(而且它似乎只检查方案,什么都不检查),而 URI 似乎会返回“true”,无论你扔什么(甚至是“---”)。到目前为止,我还没有找到一种能够99.9%正常工作的方法来完成 OP 所要求的操作。 - Neph

15
public static boolean isValidURL(String urlString) {
    try {
        URL url = new URL(urlString);
        url.toURI();
        return true;
    } catch (Exception e) {
        return false;
    }
}

根据RFC2396的规定进行检查,格式为<scheme>://<authority><path>?<query>#<fragment>,但是scheme必须被URL源代码所知道。

以下URL不合法:

  • telnet://melvyl.ucop.edu
  • news:comp.infosystems.www.servers.unix
  • www.google.com

1
为什么不直接使用 new URI(urlString) - Chloe

12

如果你在编写Android程序,你可以使用android.webkit.URLUtil进行测试。

URLUtil.isHttpUrl(url)
URLUtil.isHttpsUrl(url)

希望它会有所帮助。


12
这段代码实际上只检查 URL 开头是否有 http://,而非检查是否为 URL。如果想要检查 URL 是否合法,应该使用 URLUtil.isValidUrl(url)。 - Amr El Aswar
1
快速提醒,它被称为URLUtil...而不是URLUtilS - Tommie

11

补充Bozho的答案,更加实用的方法如下:

  1. 下载apache commons 并解压缩。 binaries
  2. 将commons-validator-1.4.0.jar包含在您的Java构建路径中。
  3. 使用此示例代码(参考资料)进行测试:

    //...your imports
    
    import org.apache.commons.validator.routines.*; // Import routines package!
    
    public static void main(String[] args){
    
    // Get an UrlValidator
    UrlValidator defaultValidator = new UrlValidator(); // default schemes
    if (defaultValidator.isValid("http://www.apache.org")) {
        System.out.println("valid");
    }
    if (!defaultValidator.isValid("http//www.oops.com")) {
        System.out.println("INvalid");
    }
    
    // Get an UrlValidator with custom schemes
    String[] customSchemes = { "sftp", "scp", "https" };
    UrlValidator customValidator = new UrlValidator(customSchemes);
    if (!customValidator.isValid("http://www.apache.org")) {
        System.out.println("valid");
    }
    
    // Get an UrlValidator that allows double slashes in the path
    UrlValidator doubleSlashValidator = new UrlValidator(UrlValidator.ALLOW_2_SLASHES);
    if (doubleSlashValidator.isValid("http://www.apache.org//projects")) {
        System.out.println("INvalid");
    }
    
  4. 运行/调试


3

这个函数用于验证URL,返回 true(有效URL)或 false(无效URL)。

public static boolean isURL(String url) {
    try {
        new URL(url);
        return true;
    } catch (Exception e) {
        return false;
    }
}

请确保import java.net.URL;已经被导入。

3
当应该失败时,对于 http://ProductDetail/2Thumbz, Inc.?source=Admin 不会失败(逗号、空格、句点)。 - Chloe

1
^(https://|http://|ftp://|ftps://)(?!-.)[^\\s/\$.?#].[^\\s]*$

这是一个用于验证http、https、ftp和ftps协议的URL的正则表达式。

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