java中判断一个字符串是绝对URL还是相对URL
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4390800/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
determine if a string is absolute URL or relative URL in java
提问by khalsa
Given a string, how do I determine if it is absolute URL or relative URL in Java? I tried the following code:
给定一个字符串,如何确定它是 Java 中的绝对 URL 还是相对 URL?我尝试了以下代码:
private boolean isAbsoluteURL(String urlString)
{
boolean result = false;
try
{
URL url = new URL(urlString);
String protocol = url.getProtocol();
if (protocol != null && protocol.trim().length() > 0)
result = true;
}
catch (MalformedURLException e)
{
return false;
}
return result;
}
The problem is that all relative URLs are throwing the MalformedURLException as there is no protocol defined (example: www.google.com and /questions/ask).
问题是所有相对 URL 都抛出 MalformedURLException,因为没有定义协议(例如:www.google.com 和 /questions/ask)。
回答by khachik
As I said i my comment, you have to normalize the URL, before checking it, and that normalization depends on your application, since www.google.com
is not an absolute URL. Here is an example code, which can be used to check URLs to be absolute:
正如我在评论中所说,您必须在检查 URL 之前对其进行规范化,并且规范化取决于您的应用程序,因为www.google.com
它不是绝对 URL。这是一个示例代码,可用于检查 URL 是否为绝对:
import java.net.URL;
public class Test {
public static void main(String [] args) throws Exception {
String [] urls = {"www.google.com",
"http://www.google.com",
"/search",
"file:/dir/file",
"file://localhost/dir/file",
"file:///dir/file"};
for(String url:urls) {
System.out.println("`" + url + "' is " +
(isAbsoluteURL(url)?"absolute":"relative"));
}
}
public static boolean isAbsoluteURL(String url)
throws java.net.MalformedURLException {
final URL baseHTTP = new URL("http://example.com");
final URL baseFILE = new URL("file:///");
URL frelative = new URL(baseFILE, url);
URL hrelative = new URL(baseHTTP, url);
System.err.println("DEBUG: file URL: " + frelative.toString());
System.err.println("DEBUG: http URL: " + hrelative.toString());
return frelative.equals(hrelative);
}
}
running:
跑步:
~$ java Test 2>/dev/null
`www.google.com' is relative
`http://www.google.com' is absolute
`/search' is relative
`file:/dir/file' is absolute
`file://localhost/dir/file' is absolute
`file:///dir/file' is absolute
回答by Renaud
This is a snippet I use to ensure links are absolute:
这是我用来确保链接是绝对链接的片段:
private String ensureAbsoluteURL(String base, String maybeRelative) {
if (maybeRelative.startsWith("http")) {
return maybeRelative;
} else {
try {
return new URL(new URL(base), maybeRelative).toExternalForm();
} catch (MalformedURLException e) {
// do something
}
}
}
回答by Chris
How about:
怎么样:
final URI u = new URI("http://www.anigota.com/start");
// URI u = new URI("/works/with/me/too");
// URI u = new URI("/can/../do/./more/../sophis?ticated=stuff+too");
if(u.isAbsolute())
{
System.out.println("Yes, i am absolute!");
}
else
{
System.out.println("Ohh noes, it's a relative URI!");
}
see for details: http://docs.oracle.com/javase/7/docs/api/java/net/URI.html
详情请参阅:http: //docs.oracle.com/javase/7/docs/api/java/net/URI.html
HTH
HTH
回答by Ufkoku
I made this
我做的
public static String processUrl(String urlToProcess, String grantedNormalUrl){
if (urlToProcess.startsWith("//")){
urlToProcess = checkUrlStartsWithProtocol(urlToProcess);
return urlToProcess;
}
if (!isAbsolute(urlToProcess)){
String rootPage = extractRootPage(grantedNormalUrl);
boolean domainEndsWithSlash = rootPage.endsWith("/");
boolean urlStartsWithSlash = urlToProcess.startsWith("/");
if (domainEndsWithSlash && urlStartsWithSlash){
rootPage = rootPage.substring(0, rootPage.length() - 1); // exclude /
}
urlToProcess = rootPage + (!(domainEndsWithSlash || urlStartsWithSlash) ? "/" : "") + urlToProcess;
}
return urlToProcess;
}
public static boolean isAbsolute(String url){
if (url.startsWith("//")) { // //www.domen.com/start
return true;
}
if (url.startsWith("/")){ // /somePage.html
return false;
}
boolean result = false;
try {
URI uri = new URI(url);
result = uri.isAbsolute();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return result;
}
public static String checkUrlStartsWithProtocol(String url) {
if (!url.startsWith("http://") && !url.startsWith("https://")) {
StringBuilder prefixBuilder = new StringBuilder();
prefixBuilder.append("http:");
if (!url.startsWith("//")) {
prefixBuilder.append("//");
}
url = prefixBuilder.toString() + url;
}
return url;
}
public static String extractRootPage(String urlString) {
int ignoreSlashes = 0;
if (urlString.startsWith("http://") || urlString.startsWith("https://")) {
ignoreSlashes = 2;
}
int endPosition = urlString.length();
for (int i = 0; i < urlString.length(); i++) {
if (urlString.charAt(i) == '/') {
if (ignoreSlashes == 0) {
endPosition = i; //substring exclude /
break;
} else {
ignoreSlashes--;
}
}
}
return checkUrlStartsWithProtocol(urlString.substring(0, endPosition));
}