URLがJavaで有効かどうかを確認する最良の方法は何ですか?
new URL(urlString)
を呼び出してMalformedURLException
をキャッチしようとしたが、http://
で始まるものには満足しているようです。
接続の確立については気にせず、有効性のみを考慮します。これには方法がありますか? Hibernate Validatorの注釈?正規表現を使用する必要がありますか?
編集:受け入れられるURLの例には、http://***
およびhttp://my favorite site!
があります。
Apache Commons UrlValidatorクラス の使用を検討してください
UrlValidator urlValidator = new UrlValidator();
urlValidator.isValid("http://my favorite site!");
このクラスの動作を制御するために設定できるプロパティがいくつかあります。デフォルトでは、http
、https
、およびftp
が受け入れられます。
これが私が試したときに役に立つとわかった方法です。
URL u = new URL(name); // this would check for the protocol
u.toURI(); // does the extra checking required for validation of URI
これを 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;
そこから独自のバリデータを簡単に構築できます。
最も「確実な」方法は、URLの可用性を確認することです。
public boolean isURL(String url) {
try {
(new Java.net.URL(url)).openStream().close();
return true;
} catch (Exception ex) { }
return false;
}
外部ライブラリなしの私のお気に入りのアプローチ:
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) {
}
URI
のソースコードから判断すると、
public URL(URL context, String spec, URLStreamHandler handler)
コンストラクターは、他のコンストラクターよりも多くの検証を行います。あなたはそれを試すかもしれませんが、YMMV。
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 で正規表現の検証が試行されます。
私はどの実装も好きではありませんでした(高価な操作である正規表現、または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;
}