[英]determine if a string is absolute URL or relative URL in java
Given a string, how do I determine if it is absolute URL or relative URL in Java? 给定一个字符串,如何确定它是Java中的绝对URL还是相对URL? I tried the following code: 我尝试了以下代码:
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). 问题在于,由于未定义任何协议(例如:www.google.com和/ questions / ask),所有相对URL都抛出MalformedURLException。
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 高温超导
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
}
}
}
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. 正如我在评论中所说,您必须先对URL进行规范化,然后再进行检查,并且规范化取决于您的应用程序,因为www.google.com
并非绝对URL。 Here is an example code, which can be used to check URLs to be absolute: 这是一个示例代码,可用于检查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
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));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.