URL有效字符。使用Java进行验证

9

像 'www.test.com' 这样的字符串是好的。

像 'www.888.com' 这样的字符串是好的。

像 'stackoverflow.com' 这样的字符串是好的。

像 'GOoGle.Com' 这样的字符串是好的。

为什么?因为这些都是有效的网址,它们是否被注册并不重要。

现在,不好的字符串有:

'goog*d\x'

'manydots...com'

为什么?因为你不能注册这些网址。

如果我有一个在 Java 中的字符串,它应该是一个好的网址,最好的验证方法是什么?

非常感谢。


可能是重复的问题:如何在Java中检查有效的URL? - om-nom-nom
5个回答

10

使用Apache Commons库中的UrlValidator。二进制包:http://www.mirrorservice.org/sites/ftp.apache.org/commons/validator/binaries/commons-validator-1.3.1.zip(zip包含.jar文件)

用法示例(构建一个具有有效方案“http”和“https”的UrlValidator):

String[] schemes = {"http","https"}.
UrlValidator urlValidator = new UrlValidator(schemes);
if (urlValidator.isValid("ftp://foo.bar.com/")) {
   System.out.println("url is valid");
} else {
   System.out.println("url is invalid");
}

打印出“URL无效”。

如果使用默认构造函数,则会发生相反的情况。

UrlValidator urlValidator = new UrlValidator();
if (urlValidator.isValid("ftp://foo.bar.com/")) {
   System.out.println("url is valid");
} else {
   System.out.println("url is invalid");
}

输出 "url is valid"


3

这些示例是主机名。它们本身不是有效的URL。

主机名由用 . 分隔的“标签”组成。每个标签必须是字母、数字和连字符的最多63个字符,但连字符不能是第一个或最后一个字符。在整个主机名之后跟另一个点是可选的。

您可以使用类似于以下模式进行匹配(假设不区分大小写):

([a-z0-9]|[a-z0-9][a-z0-9\-]{0,61}[a-z0-9])(\.[a-z0-9]|[a-z0-9][a-z0-9\-]{0,61}[a-z0-9])*\.?

然而,这种匹配方式也可以匹配像1.2.3.4这样的字符串,尽管它们在技术上可以是主机名/域名,但实际上它们将被视为直接IP地址。您可能希望允许这种情况。如果您这样做,您可能还想允许IPv6地址,这些地址是由冒号分隔的十六进制数字;当嵌入到URL中时,它们也有方括号包围。
然后当然还有IDNA。现在,例え.テスト是一个有效的IDNA域名,对应于xn--r8jz45g.xn--zckzah。如果您想允许这些内容,则需要一些Unicode支持。
总结:这比您想象的要复杂得多。而这只是主机名。验证整个URL甚至更加繁琐。简单的正则表达式无法胜任。使用现有的库。

-1
我认为new URL(yourString)可以解决问题:如果URL不符合规范,它应该会引发MalformedURLException(实际上在Java API中它说如果字符串指定了未知协议,但你仍然可以尝试):
try
{
   new URL(string);
} catch (MalformedURLException e) {
  //do whatever
}

3
URL的问题在于,每次都会尝试执行查找操作 :( - OscarRyz
是的,那是真的,但除了使用正则表达式之外,你还能用什么方法验证一个URL呢? - Shervin Asgari
1
@Shervin:使用Commons UrlValidator。 - BalusC
1
@Shervin:使用以下链接进行参考:https://dev59.com/VE3Sa4cB1Zd3GeqPsA8J#2601792 - OscarRyz
就像我之前说的那样,这些示例必须使用正则表达式来检查URL是否有效。如果你不想建立连接,这是唯一的方法。 - Shervin Asgari
这个不起作用。https://dev59.com/TXI-5IYBdhLWcg3w8dYQ#5965755 - Martin

-1

我也相信你可以在java.net中使用URL

URL url = new URL("www.google.com");

API中写道:

public URL(String spec) throws MalformedURLException 参数: spec - 要解析为URL的字符串。 抛出: MalformedURLException - 如果字符串指定了未知协议,则会抛出异常。

因此,如果URL无效,则会抛出异常。


这个不起作用。https://dev59.com/TXI-5IYBdhLWcg3w8dYQ#5965755 - Martin

-2

你可以通过正则表达式来进行这种“URL验证”。

这里是你可以获取一些好的URL正则表达式的地方(这样你就不必自己编写了)。


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