web-dev-qa-db-ja.com

Javaで有効なURLを確認する方法は?

URLがJavaで有効かどうかを確認する最良の方法は何ですか?

new URL(urlString)を呼び出してMalformedURLExceptionをキャッチしようとしたが、http://で始まるものには満足しているようです。

接続の確立については気にせず、有効性のみを考慮します。これには方法がありますか? Hibernate Validatorの注釈?正規表現を使用する必要がありますか?

編集:受け入れられるURLの例には、http://***およびhttp://my favorite site!があります。

83
Eric Wilson

Apache Commons UrlValidatorクラス の使用を検討してください

UrlValidator urlValidator = new UrlValidator();
urlValidator.isValid("http://my favorite site!");

このクラスの動作を制御するために設定できるプロパティがいくつかあります。デフォルトでは、httphttps、およびftpが受け入れられます。

92
Tendayi Mawushe

これが私が試したときに役に立つとわかった方法です。

URL u = new URL(name); // this would check for the protocol
u.toURI(); // does the extra checking required for validation of URI 
55
Prasanna Pilla

これを Tendayi Mawusheの答え へのコメントとして投稿したいと思いますが、十分なスペースがないと思います;)

これは、Apache Commons UrlValidator source の関連部分です。

/**
 * This expression derived/taken from the BNF for URI (RFC2396).
 */
private static final String URL_PATTERN =
        "/^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/";
//         12            3  4          5       6   7        8 9

/**
 * Schema/Protocol (ie. http:, ftp:, file:, etc).
 */
private static final int PARSE_URL_SCHEME = 2;

/**
 * Includes hostname/ip and port number.
 */
private static final int PARSE_URL_AUTHORITY = 4;

private static final int PARSE_URL_PATH = 5;

private static final int PARSE_URL_QUERY = 7;

private static final int PARSE_URL_FRAGMENT = 9;

そこから独自のバリデータを簡単に構築できます。

6

最も「確実な」方法は、URLの可用性を確認することです。

public boolean isURL(String url) {
  try {
     (new Java.net.URL(url)).openStream().close();
     return true;
  } catch (Exception ex) { }
  return false;
}
4
Voodoo

外部ライブラリなしの私のお気に入りのアプローチ:

try {
    URI uri = new URI(name);

    // perform checks for scheme, authority, Host, etc., based on your requirements

    if ("mailto".equals(uri.getScheme()) {/*Code*/}
    if (uri.getHost() == null) {/*Code*/}

} catch (URISyntaxException e) {
}
4
Andrei Volgin

URIのソースコードから判断すると、

public URL(URL context, String spec, URLStreamHandler handler)

コンストラクターは、他のコンストラクターよりも多くの検証を行います。あなたはそれを試すかもしれませんが、YMMV。

3
uckelman

検証パッケージ:

rlUtilと呼ばれるYonatan Matalonによる素敵なパッケージ があるようです。 APIの引用:

isValidWebPageAddress(Java.lang.String address, boolean validateSyntax, 
                      boolean validateExistance) 
Checks if the given address is a valid web page address.

サンのアプローチ-ネットワークアドレスを確認してください

SunのJavaサイトが提供する ソリューションとしての接続試行 URLの検証用。

その他の正規表現コードスニペット:

Oracleのサイト および weberdev.com で正規表現の検証が試行されます。

3
Adam Matan

私はどの実装も好きではありませんでした(高価な操作である正規表現、または1つのメソッドのみが必要な場合は過剰なライブラリを使用するため)ので、Java.net.URIクラスをいくつか使用して追加のチェック、およびプロトコルの制限:http、https、file、ftp、mailto、news、urn。

そして、はい、例外のキャッチは高価な操作になる可能性がありますが、おそらく正規表現ほど悪くはありません:

final static Set<String> protocols, protocolsWithHost;

static {
  protocolsWithHost = new HashSet<String>( 
      Arrays.asList( new String[]{ "file", "ftp", "http", "https" } ) 
  );
  protocols = new HashSet<String>( 
      Arrays.asList( new String[]{ "mailto", "news", "urn" } ) 
  );
  protocols.addAll(protocolsWithHost);
}

public static boolean isURI(String str) {
  int colon = str.indexOf(':');
  if (colon < 3)                      return false;

  String proto = str.substring(0, colon).toLowerCase();
  if (!protocols.contains(proto))     return false;

  try {
    URI uri = new URI(str);
    if (protocolsWithHost.contains(proto)) {
      if (uri.getHost() == null)      return false;

      String path = uri.getPath();
      if (path != null) {
        for (int i=path.length()-1; i >= 0; i--) {
          if ("?<>:*|\"".indexOf( path.charAt(i) ) > -1)
            return false;
        }
      }
    }

    return true;
  } catch ( Exception ex ) {}

  return false;
}
2
isapir