如何判断字符串是否是网址?

时间:2009-02-09 08:55:37

标签: html url

确定字符串是否代表网址的最佳方法是什么?我需要让用户在表单中输入网址,但如何验证输入?应允许用户输入“http://www.google.com”或“www.vg.no”等字符串,但不应要求他输入“http://”。此外,有像“tv2.no”这样的网页更难以验证。如果我检查字符串是否包含“www”或“http://”我有一个强有力的线索,但我仍然不是100%肯定。我能100%肯定吗?我不这么认为,但也许这里的一些优秀思想能够启发我吗?

12 个答案:

答案 0 :(得分:6)

为随后的表达道歉,但它似乎捕获了大多数(如果不是全部)案例:

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?(?#Username:Password)(?:\w+:\w­+@)?
(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)
(?:com|org|net|gov|mil|biz|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})+­)?(?#What not to end in)[^.!,:;?]$

答案 1 :(得分:3)

首先,尝试使用正则表达式验证输入文本是否是格式正确的URL。如果检查结果正常,请尝试DNS查找以验证主机是否已知。不要忘记localhost或127.0.0.1的特例。还要注意由其IP地址指定的主机。如果这些检查没问题,您可能想尝试实际连接。

如果这些检查失败,您可以修改输入文本并再次检查。可能的修改包括:

  • prepend http://
  • prepend www.
  • 追加.com.org.net,无论
  • 追加:8080:8888,无论
  • 混合任何上述解决方案
  • 尝试在file:///前加上本地访问权

答案 2 :(得分:3)

请注意,以下两个也是有效的网址。你想允许他们吗?

  • localhost
  • 208.77.188.166

答案 3 :(得分:3)

我的建议是不要完全确认。相反,使用基于正则表达式的方法,如果这不匹配,你可以发出一个软警告:“你写的东西看起来不像一个有效的地址。你确定这是你想写的吗?”。< / p>

绝对不要按照尝试连接到地址的想法。这样可以解决各种令人讨厌的安全问题,包括将您的网站用于针对其他网站的拒绝服务攻击。那会让你陷入法律困境。

进行DNS查找的成本很高,但如果您认为值得付费,则可行。

答案 4 :(得分:2)

如何使用Regular Expression

具体的实施方式取决于您使用的语言。

答案 5 :(得分:1)

合理确定的最简单方法是使用正则表达式,确保至少有两个域名组件。这样你就可以处理大多数不良案件。看起来应该是这样的:

/^(http:\/\/)?(\w+)(\.\w+)+$/

答案 6 :(得分:1)

如果您不打算将其强制为有效的URI(即,您将该方案设为可选),那么唯一真正的选择是尝试通过HTTP连接到它。

答案 7 :(得分:1)

你可以从你的应用程序进行DNS查找,这将解决任何“我不确定它是否是真正的地址”。

答案 8 :(得分:1)

您可以使用Zend_Uri

的验证功能

答案 9 :(得分:0)

如果您不想要求他们输入http://(或https://),那么您唯一能做的就是该字符串是否包含“。” (我假设您不需要处理“内部”服务器?)。您还可以对已知域进行验证并检查无效字符,但除此之外几乎任何事情都可以。

至于实际实施,如果你能忍受它,那么正则表达式就是你要走的路。毫无疑问,如果你使用Google,就会有无数的验证网址的例子。

答案 10 :(得分:0)

我认为最快的方法是通过正则表达式测试。但是,这不能证明它是否是有效的URL

答案 11 :(得分:0)

请参阅有关CPAN的Regexp::Common,尤其是R::C::URIR::C::URI::http。即使您不能自己使用模块,源代码中也会有正则表达式。这是一个好的开始。