Как проверить действительный URL-адрес в Java?
что является лучшим способом, чтобы проверить, если URL-адрес является действительным в Java?
если пытались позвонить new URL(urlString) и поймать MalformedURLException, но он, кажется, доволен всем, что начинается с http://.
Я не беспокоюсь об установлении соединения, просто действительность. Есть ли способ для этого? Аннотация в Hibernate Validator? Должен ли я использовать регулярное выражение?
Edit: некоторые примеры принятых URL-адресов http://*** и http://my favorite site!.
7 ответов:
рассмотрите возможность использования Apache Commons UrlValidator class
UrlValidator urlValidator = new UrlValidator(); urlValidator.isValid("http://my favorite site!");есть несколько свойств, которые можно задать для управления поведением этого класса, по умолчанию
http,httpsи есть.
вот как я пробовал и нашел полезным,
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 источник:
/** * 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;вы можете легко создать свой собственный валидатор оттуда.
мой любимый подход, без внешних библиотек:
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) { }
валидатор пакет:
кажется хороший пакет Йонатан Маталон называется UrlUtil. Цитируя его API:
isValidWebPageAddress(java.lang.String address, boolean validateSyntax, boolean validateExistance) Checks if the given address is a valid web page address.подход Солнца-проверьте сетевой адрес
сайт Java Sun предлагает попытка подключения в качестве решения для проверки URL-адресов.
другие фрагменты кода регулярных выражений:
есть попытки проверки регулярных выражений на сайт Oracle и weberdev.com.
судя по исходному коду
URIнаpublic URL(URL context, String spec, URLStreamHandler handler)конструктор выполняет больше проверок, чем другие конструкторы. Вы можете попробовать это, но YMMV.
мне не понравилась ни одна из реализаций (потому что они используют регулярное выражение, которое является дорогостоящей операцией, или библиотеку, которая является излишней, если вам нужен только один метод), поэтому я в конечном итоге использовал класс 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; }
Comments