Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何判断字符串是否为web地址?_Html_Url - Fatal编程技术网

Html 如何判断字符串是否为web地址?

Html 如何判断字符串是否为web地址?,html,url,Html,Url,确定字符串是否表示web地址的最佳方法是什么?我需要让用户在表单中输入网址,但如何验证输入?应允许用户输入“”或“www.vg.no”等字符串,但不应要求用户输入“http://”。此外,还有像“tv2.no”这样的网页更难验证。如果我检查字符串是否包含“www”或“http://”,我有很强的线索,但我仍然不能100%确定。我能百分之百肯定吗?我不这么认为,但也许so的一些优秀人才可以启发我呢?使用一个 具体的实现方式取决于您使用的语言。最简单的合理确定方法是使用正则表达式,确保您至少有两个域

确定字符串是否表示web地址的最佳方法是什么?我需要让用户在表单中输入网址,但如何验证输入?应允许用户输入“”或“www.vg.no”等字符串,但不应要求用户输入“http://”。此外,还有像“tv2.no”这样的网页更难验证。如果我检查字符串是否包含“www”或“http://”,我有很强的线索,但我仍然不能100%确定。我能百分之百肯定吗?我不这么认为,但也许so的一些优秀人才可以启发我呢?

使用一个


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

最简单的合理确定方法是使用正则表达式,确保您至少有两个域名组件。这样你就可以处理大多数糟糕的情况。它应该是这样的:

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

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


至于实际的实现,如果你能忍受的话,正则表达式将是一条出路。。毫无疑问,如果你在谷歌上搜索,验证URL的例子数不胜数。

如果你不打算强制它成为一个有效的URI(也就是说,你让方案成为可选的),那么唯一真正的选择就是尝试通过HTTP连接到它。

我认为最快的方法是通过正则表达式测试。但是,这并不能证明它是否是有效的URL。首先,请尝试使用正则表达式验证输入文本是否是格式正确的URL。如果检查正常,请尝试DNS查找以验证主机是否已知。不要忘记localhost或127.0.0.1的特殊情况。还要注意由其IP地址指定的主机。如果这些检查正常,您可能需要尝试实际连接

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

  • 预编
    http://
  • 预编
    www.
  • 附加
    .com
    .org
    .net
    ,无论什么
  • 附加
    :8080
    :8888
    ,随便什么
  • 混合上述任何一种溶液
  • 还可以尝试为本地访问预先设置
    文件://

参见CPAN,尤其是和。即使您不能使用模块本身,源代码中也有正则表达式。这是一个好的开始。

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

  • localhost
  • 208.77.188.166

您是否可以从应用程序中进行DNS查找,这将绕过任何“我不确定它是否是真实地址”的问题。

您可以使用的验证功能对随后的表达表示歉意,但它似乎捕获了大多数(如果不是全部)情况:


我的建议是完全不验证。相反,使用基于正则表达式的方法,如果不匹配,您可以给出一个软警告:“您所写的地址看起来不是有效的地址。您确定这是您要写的吗?”

绝对不要尝试连接到该地址。这将使您面临各种严重的安全问题,包括使用您的网站对其他网站进行拒绝服务攻击。那会给你带来法律上的麻烦


进行DNS查找的成本很高,但如果您认为值得的话,这是可行的。

我想我们都知道正则表达式可以用于模式匹配,我想他是在寻求一种启发式方法,允许接受人类可读的“URL”,即slashdot.org,而不是slashdot.org,这难道不是正则表达式应该接受的字符串的子集吗?“摇摇晃晃的驴子”通过了那个正则表达式,它不是一个有效的地址(包含空格和全部)不,它不是。点之前的斜杠非常重要。你没有任何点。也就是说,你是对的。它不应该是。*?。可能最好使用类似[[:alpha:]的东西*如果有端口号怎么办?如果URL中有查询怎么办?使用一些经过测试的regexp比自己发明轮子要好得多。当然。这完全取决于你想要的确定程度。这就是为什么我没有说我的表达式是解决方案,只是一个简单版本的示例。+1用于最大限度地提高可用性。此外,如果你只在地址栏中输入“巴塞罗那”,一些浏览器等将提供谷歌搜索,这并不总是一件坏事(当然,在OP的上下文中这可能是一件坏事——他应该更好地解释这一点)。我会对连接到给定的URL感到不安,因为存在安全隐患,特别是如果海报不能100%确定他在做什么。我认为,如果“连接”只意味着检查成功或失败,而不递归下载每个内联图像、javascript、CSS等,这可能是安全的。例如,可以使用text-b执行是的,但总有可能有人传递了一些东西,比如www.site.com/delete.php?all,并对受害者隐藏了他的IP,或者有人可以传递file:///usr/lib/foo 并检查您的系统中是否存在该文件等。换言之:我不会越过“100%安全”的界限还有其他问题:如果目标网站现在关闭,十分钟后就会回来怎么办?如果你在寻找“www”,你根本就没有任何线索。Blogspot博客和无数其他网站(包括你现在所在的网站)没有,它们是有效的地址。您能告诉我们更多关于您的验证将被使用的场景吗?在您的“TopLevelDomains”部分中,您可以添加
^(?#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)[^.!,:;?]$