Краткий ответ
Используйте шаблон WEB_URL в классе шаблонов
Patterns.WEB_URL.matcher(potentialUrl).matches()
Он вернет True, если URL-адрес действителен, и false, если URL-адрес недопустим .
Длинный ответ
Начиная с Android API уровня 8 существует шаблон WEB_URL . Цитируя источник, он «соответствует большей части RFC 3987». Если вы нацеливаетесь на более низкий уровень API, вы можете просто скопировать шаблон из источника и включить его в свое приложение. Я предполагаю, что вы знаете, как использовать шаблоны и сопоставители, поэтому я не буду вдаваться в подробности здесь.
Также класс URLUtil предоставляет несколько полезных методов, например:
Описания методов не очень подробны, поэтому вам, вероятно, лучше всего взглянуть на источник и выяснить, какой из них лучше всего подходит для вашей цели.
Что касается того, когда запускать проверку валидации, есть несколько возможностей: вы можете использовать функции обратного вызова EditText.
или используйте TextWatcher , что, я думаю, было бы лучше.
НЕ ИСПОЛЬЗУЙТЕ URL-адрес Используйте его для проверки URL-адреса, как показано ниже.
URLUtil.isValidUrl(url)
потому что он дает такие строки, как "http: //" как действительный URL, что не соответствует действительности
/** * This is used to check the given URL is valid or not. * @param url * @return true if url is valid, false otherwise. */ private boolean isValidUrl(String url) { Pattern p = Patterns.WEB_URL; Matcher m = p.matcher(url.toLowerCase()); return m.matches(); }
источник
В случае, если в вашем UnitTest вы
NullPointerException
использовалиPatternsCompat
вместоPatterns
.fun isFullPath(potentialUrl: String): Boolean { return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches() }
Также я понял, что этот метод возвращается,
true
когда я его передаюPhoto.jpg
. Мое ожиданиеfalse
. Поэтому я предлагаю следующий метод вместо описанного выше.fun isFullPath(potentialUrl: String): Boolean { try { URL(potentialUrl).toURI() return true } catch (e: Exception) { e.printStackTrace() } return false }
источник
URLUtil.isValidUrl будет работать, поскольку он существует с уровня API 1.
источник
Используйте это регулярное выражение при проверке вашего сайта
String WebUrl = "^((ftp|http|https):\\/\\/)?(www.)?(?!.*(ftp|http|https|www.))[a-zA-Z0-9_-]+(\\.[a-zA-Z]+)+((\\/)[\\w#]+)*(\\/\\w+\\?[a-zA-Z0-9_]+=\\w+(&[a-zA-Z0-9_]+=\\w+)*)?$"; //TODO for website validation private boolean isValidate() { String website = txtWebsite.getText().toString().trim(); if (website.trim().length() > 0) { if (!website.matches(WebUrl)) { //validation msg return false; } } return true; }
источник
Или вы могли бы просто использовать старый добрый
Regex
Pattern urlRegex = Pattern.compile("((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)");
Я не говорю, что
Patterns.WEB_URL
это плохо, это просто позволяет легко проверить, что соответствует, а что нет.источник