确定字符串是否代表网址的最佳方法是什么?我需要让用户在表单中输入网址,但如何验证输入?应允许用户输入“http://www.google.com”或“www.vg.no”等字符串,但不应要求他输入“http://”。此外,有像“tv2.no”这样的网页更难以验证。如果我检查字符串是否包含“www”或“http://”我有一个强有力的线索,但我仍然不是100%肯定。我能100%肯定吗?我不这么认为,但也许这里的一些优秀思想能够启发我吗?
答案 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地址指定的主机。如果这些检查没问题,您可能想尝试实际连接。
如果这些检查失败,您可以修改输入文本并再次检查。可能的修改包括:
http://
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::URI和R::C::URI::http。即使您不能自己使用模块,源代码中也会有正则表达式。这是一个好的开始。