2010-12-08 11 views
21

文字列を指定すると、絶対URLかJavaの相対URLかをどのように判断できますか?私は、次のコードを試してみました:文字列が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; 
    } 

問題は(例:www.google.comおよび/質問/依頼する)定義されたプロトコルが存在しないよう、すべての相対URLがでMalformedURLExceptionを投げているということです。

+2

を作りました。これは期待される結果である。それではどうしたの? –

+0

「www.google.com」と「/ questions/ask」はURLではありません。暗黙のURLスキームに応じて、絶対URIまたは相対URIにすることができます。したがって、このコードは「期待どおりに動作する」カテゴリに分類されます。 – cdhowie

+0

URLがネットワーク接続を使用していることを確認する – OscarRyz

答えて

2

www.google.comは絶対URLではないため、私は自分のコメントを言ったので、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); 
    } 
} 

ランニング:

~$ 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 
2

これは、私はリンクが絶対的であることを確認するために使用する断片である:

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 
     } 
    } 
} 
+0

ええええええええええええええええええええええええええええ、URLは様々なスキーマを含んでいる場合がありますが、httpを離れても...動的ではありませんが、助けてくださりありがとうございます –

37

約:

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!"); 
} 

詳細:あなたが例外をキャッチし、falseを返すようhttp://docs.oracle.com/javase/7/docs/api/java/net/URI.html

HTH

+5

[Protocol Urls](http://www.paulirish.com/2010/) the-protocol-relative-url /)(URLのように//)。 [IDEOneで試してみてください](http://ideone.com/9AlUkU) –

+0

これは[この例のように](http://jsfiddle.net/3f0gqvbf/1/)絶対リダイレクトを行うのに使うことができます。 –

0

私は、相対URLは、実際には、絶対URLではないことを示す、...この

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)); 
} 
関連する問題