URL действительные символы. Java для проверки - PullRequest
9 голосов
/ 08 апреля 2010

строка вроде «www.test.com» - это хорошо. строка вроде: «www.888.com» - это хорошо. строка вроде: 'stackoverflow.com' хороша. строка вроде: «GOoGle.Com» - это хорошо.

почему? потому что это действительные URL. это не обязательно имеет значение, если они были зарегистрированы или нет.

Теперь плохие строки:

'GOOG * d \ х' 'manydots ... com'

почему, потому что вы не можете зарегистрировать эти URL.

если у меня есть строка в Java, которая должна быть хорошим URL какой лучший способ проверить это?

большое спасибо

Ответы [ 5 ]

9 голосов
/ 08 апреля 2010

использовать UrlValidator из библиотеки Apache Commons . Двоичный пакет: http://www.mirrorservice.org/sites/ftp.apache.org/commons/validator/binaries/commons-validator-1.3.1.zip (zip-файл содержит файлы .jar)

Пример использования (Построить UrlValidator с допустимыми схемами «http» и «https»):

String[] schemes = {"http","https"}.
UrlValidator urlValidator = new UrlValidator(schemes);
if (urlValidator.isValid("ftp://foo.bar.com/")) {
   System.out.println("url is valid");
} else {
   System.out.println("url is invalid");
}

печатает "URL недействителен"

Если вместо этого используется конструктор по умолчанию.

UrlValidator urlValidator = new UrlValidator();
if (urlValidator.isValid("ftp://foo.bar.com/")) {
   System.out.println("url is valid");
} else {
   System.out.println("url is invalid");
}

распечатывает "URL действителен"

3 голосов
/ 08 апреля 2010

Такими примерами являются hostnames .Сами по себе они не являются действительными URL.

Имена хостов состоят из . разделенных «меток».Каждая метка должна содержать до 63 символов букв, цифр и дефисов, но дефис не должен быть первым или последним символом.Необязательно следовать за целым именем хоста с помощью другой точки.

Вы можете сопоставить это с шаблоном (например, без учета регистра):

([a-z0-9]|[a-z0-9][a-z0-9\-]{0,61}[a-z0-9])(\.[a-z0-9]|[a-z0-9][a-z0-9\-]{0,61}[a-z0-9])*\.?

Однако это соответствует строкам, таким как 1.2.3.4также, которые, хотя технически они могут быть именами хостов / доменов, фактически будут действовать как прямые IP-адреса.Вы можете разрешить это.Если вы это сделаете, вы также можете разрешить адреса IPv6, которые разделены двоеточием шестнадцатеричной;когда они встроены в URL, они также заключены в квадратные скобки.

И, конечно, есть IDNA.В настоящее время 例え.テスト является действительным доменным именем IDNA, соответствующим xn--r8jz45g.xn--zckzah.Если вы хотите разрешить их, вам понадобится поддержка Unicode.

Резюме: это немного сложнее, чем вы думаете.И это только имена хостов.«Проверка» целого URL - еще большая работа.Простое регулярное выражение не собирается взломать его.Используйте уже существующую библиотеку.

0 голосов
/ 08 апреля 2010

Я также считаю, что вы можете использовать URL в java.net

URL url = new URL("www.google.com");

API говорит public URL(String spec) throws MalformedURLException Parameters: spec - the String to parse as a URL. Throws: MalformedURLException - If the string specifies an unknown protocol.

Таким образом, исключение выдается, если URL недействителен.

0 голосов
/ 08 апреля 2010

Вы можете выполнить этот вид «проверки URL» через Регулярные выражения .

И здесь - это место, где вы можете получить несколько хороших регулярных выражений URL (так что вам не нужно писать свой собственный).

0 голосов
/ 08 апреля 2010

Я думаю, что new URL(yourString) сделает свое дело: он должен поднять MalformedURLException, если URL не соответствует (на самом деле на Java API это говорит Если строка указывает неизвестный протокол , но вы можете попробовать в любом случае):

try
{
   new URL(string);
} catch (MalformedURLException e) {
  //do whatever
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...