像'www.test.com'这样的字符串很好。 像'www.888.com'这样的字符串很好。 像'stackoverflow.com'这样的字符串很好。 像'GOoGle.Com'这样的字符串很好。
为什么?因为那些是有效的网址。如果他们已经注册,则没有必要重要。现在坏字符串是:
'goog * d \ X' 'manydots ... com'
为什么因为您无法注册这些网址。
如果我在java中有一个字符串应该是一个很好的URL 什么是验证它的最佳方法?
非常感谢
答案 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是您可以获得一些优秀网址正则表达式的地方(因此您无需自己编写)。