网址有效字符。 java来验证

时间:2010-04-08 16:42:42

标签: java url

像'www.test.com'这样的字符串很好。 像'www.888.com'这样的字符串很好。 像'stackoverflow.com'这样的字符串很好。 像'GOoGle.Com'这样的字符串很好。

为什么?因为那些是有效的网址。如果他们已经注册,则没有必要重要。

现在坏字符串是:

'goog * d \ X' 'manydots ... com'

为什么因为您无法注册这些网址。

如果我在java中有一个字符串应该是一个很好的URL 什么是验证它的最佳方法?

非常感谢

5 个答案:

答案 0 :(得分:9)

使用UrlValidator中的Apache Commons library。二进制包: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");
}

打印“网址无效”

相反,如果使用默认构造函数。

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

打印出“网址有效”

答案 1 :(得分: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支持。

总结:这比你想象的要困难得多。这只是主机名。 “验证”整个网址的工作量更大。一个简单的正则表达式不会破解它。使用预先存在的库。

答案 2 :(得分:0)

我认为new URL(yourString)可以解决问题:如果url不符合,它应该引发MalformedURLException(实际上在java api上它说如果字符串指定了一个未知的协议,但无论如何你都可以尝试):

try
{
   new URL(string);
} catch (MalformedURLException e) {
  //do whatever
}

答案 3 :(得分:0)

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

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

api说 public URL(String spec) throws MalformedURLException Parameters: spec - the String to parse as a URL. Throws: MalformedURLException - If the string specifies an unknown protocol.

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

答案 4 :(得分:-1)

您可以通过Regular Expressions进行此类“网址验证”。

here是您可以获得一些优秀网址正则表达式的地方(因此您无需自己编写)。