【发布时间】:2011-01-05 07:41:13
【问题描述】:
我目前正在使用以下正则表达式来验证 URL:
^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)? (?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|edu|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$
我从网络上的某个地方借了这个(不记得在哪里)来改进这个:
^((https?|file|ftp|gopher|news|nntp):\/\/)([a-z]([a-z0-9\-]*\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$
但是,这些都不能验证这个 url(应该是有效的):
http://somedomain.com/users/1234/images/Staff%20Photos%202008/FirstName%20LastName_1%20(Small).jpg
问题在于 %20 和圆括号 ()。尽我所能,我无法让上面的任何一个正则表达式都正确验证上面的 url 而不会破坏其他东西。我没有编写花哨的正则表达式的经验,所以这也无济于事。我发现的所有其他网络结果在诸如此类的愚蠢事情上都失败了:
http://www.test..com
我们将不胜感激。
【问题讨论】:
-
我不认为正则表达式是正确的工具。您是否有理由必须使用正则表达式?
-
您使用什么语言?也许还有另一种方法来验证它。
-
嗨,我实际上是在使用 C# 在 ASP.NET MVC 中编写一个 Web 应用程序。我的验证层使用正则表达式来确保输入的 URL 有效(很像电子邮件和电话验证)。 URL 指示文件在 Internet 和 Intranet 上的位置。在发布表单时,您是否发现了比正则表达式更好的验证方式?
标签: regex validation url url-validation