注意:我在问现实世界的问题,不是出于理论目的;看到问题的最后一部分 - 与浏览器完成工作的方式相同。
<小时/> 通常你会看到答案:
new java.net.URL(new java.net.URL(base_url),rel_url).toString
( base_url 和 rel_url 字符串)。在我的情况下, base_url 是我获取的网页的网址, rel_url 来自“&lt; a href = ...”值,因此它可能是单个“#”字符(例如)。
但是这样的代码不适用于URL片段,例如这两部分:
HTPP://www.hello.com/1.html
?p = 2时
我测试了Firefox,Chromium,Opera,Konqueror,“Web浏览器”(Gnome modesty ;-D) - 所有这些都将这些URL组合为:
HTPP://www.hello.com/1.html P = 2
使用上面的代码我得到:
HTPP://www.hello.com/ P = 2
如何以准备好的世界方式组合网址片段?
我希望在我开始自己解析之前已经有了方便的库了; - )。
答案 0 :(得分:7)
您误解了URL是什么。 ?p=2
是查询字符串,而不是相对网址。 (您还可以找到#foo
,它通常称为片段标识符或引用,最常用于跳转到长文档的一部分)。在许多其他地方,URI的完整方案是described on Wikipedia(您还可以在不同的地方找到URI和URL之间的差异)。
无论如何,相对URL仅将引用到URL的路径部分 - 它是路径是绝对路径还是相对路径。如果您有一个查询字符串并希望将其附加到现有URL(没有查询字符串),只需将其附加到字符串即可。如果您不知道是否有查询字符串,可以使用URL类中的方法来测试它。
如果您要复制浏览器的内容,请提供完整的网址url
和字符串s
,
if (s.startsWith("?") || s.startsWith("#")) new java.net.URL(url.toString + s)
else new java.net.URL(url, s)
应该做的伎俩。 (我不知道不同浏览器使用的确切代码,但这会复制您描述的附加查询字符串的行为,如果这是href中提供的所有内容。)如果您不知道现有的URL是否可能是否有查询字符串,那么你可以
if (s.startsWith("#")) new java.net.URL(url.toString.takeWhile(_ != '#') + s)
else if (s.startsWith("?")) new java.net.URL(url.toString.takeWhile(_ != '?') + s)
else new java.net.URL(url, s)