2013-02-21 47 views
2

嘿我想在java中基于What is the best regular expression to check if a string is a valid URL?的url验证,但由于某种原因,它不起作用。建议?在java中的URL验证

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class urlValidate { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     test_url("http://brb/", false); 
      test_url("https://localserver/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", false); 
    test_url("https://www.google.com/", true); 
    test_url("https://www.google.co.uk/projects/my%20folder/test.php", false); 
    test_url("https://myserver.localdomain/", true); 
    test_url("https://192.168.1.120/projects/index.php/", false); 
    test_url("https://192.168.1.1/", true); 
    test_url("https://projectpier-server.localdomain/projects/public/assets/javascript/widgets/UserBoxMenu/widget.css", false); 
    test_url("https://2.4.168.19/project-pier?c=test&a=b", false); 
    test_url("https://localhost/a/b/c/test.php?c=controller&arg1=20&arg2=20", false); 
    test_url("https://user:[email protected]/a/b/c/test.php?c=controller&arg1=20&arg2=20", false); 
    test_url("myserver",false); 
    test_url("https://tomcat:8080/",true); 
    test_url("https://facebook.com",false); 
} 

public static void test_url(String url, boolean expected) { 
    boolean valid = isURLValid(url, true); 
    String out = "URL Valid?: " + (valid ? "yes" : "no") + " for URL: " 
      + url + ". Expected: " + (expected ? "yes" : "no") + ". "; 
    if (valid == expected) { 
     out += "PASS\n"; 
    } else { 
     out += "FAIL\n"; 
    } 
    System.out.println(out); 
} 

public static boolean isURLValid(String url, boolean forcehttps) { 
    String regex = ""; 
    if (forcehttps) { 
     regex = "/^(https):\\/\\/"; 
    } else { 
     regex = "/^(https?):\\/\\/"; 
    } 
    regex += "((([a-z0-9]\\.|[a-z0-9][a-z0-9-]*[a-z0-9]\\.)*" 
      + "[a-z][a-z0-9-]*[a-z0-9]" 
      + "|((\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}" 
      + "(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])" 
      + ")(:\\d+)?)" 
      + "(#([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)?(\\/)" 
      + "$/i"; 

    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(url); // get a matcher object 
    return m.matches(); 
} 

} 
+1

@SotiriosDelimanolis - 实际上,它没有。它只关心协议是否存在。 – 2013-02-21 18:27:33

+0

@BrianRoach好东西,谢谢。 – 2013-02-21 18:29:08

+1

个人而言,我不会为了同样的原因进行复杂的URL验证,我不会进行复杂的电子邮件地址验证。看看http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/。 – entonio 2013-02-21 18:31:46

回答

2

正则表达式最初是用斜线包起来的(作为PHP的PCRE所需的分隔符)。 Java不使用这些。

if (forcehttps) { 
    regex = "^(https):\\/\\"; 
} else { 
    regex = "^(https?):\\/\\"; 
} 

/i最后也是不受欢迎的。相反,写

Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE) 
+0

+1 - 最后还有一个'/'。 – 2013-02-21 18:30:25

1

您可以使用Apache 公地验证 API。有一个类名为UrlValidator,或类似的东西。
看看这个:http://commons.apache.org/validator/
我不了解很多正则表达式,所以我在这个主题上帮不了你。
祝你好运。

+1

虽然这确实完成了手头的任务,除非你需要Apache公用程序中的其他东西,这是一个相当大的依赖关系,只是为了验证URL而附加到项目。 – 2013-02-21 18:28:51

+0

事实上,但你可以阅读他们的代码:) – 2013-02-21 18:30:47

+0

公平点,但大多数人,可悲的是,不会。 – 2013-02-21 18:33:54

0

虽然编写正则表达式到URL验证不是问题,为什么不只是使用java.io.URL类呢?只需创建URL的实例,如下所示:new URL(spec)如果语法错误,它将抛出MalformedURLExcption

+0

根据javadoc它只会抛出,如果协议丢失或'spec'为'null' – 2013-02-21 18:31:16