как проверить URL-адрес / имя веб-сайта в EditText в Android?


86

Я хочу ввести ввод, URL-адрес или просто имя веб-сайта, например www.google.com, из EditTextAndroid, и когда пользователь нажимает на значок Buttonдля отправки, или когда он EditTextтеряет фокус, URL-адрес должен быть подтвержден, например, в формате " www.anyURL.com "...

Как я могу это сделать? Есть ли в Android встроенные функции?

Ответы:


279

Краткий ответ

Используйте шаблон 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, что не соответствует действительности


16
Если вы посмотрите на источник URLUtil, isValidUrl () и isHttpUrl () в основном такие же, как startWith ("http: //"), поэтому будьте осторожны, используя их, так как вы можете не получить желаемых результатов. Использование шаблона WEB_URL намного лучше подходит для проверки URL-адресов.
— Дэйв

URLUtil.isValidUrl (downloadImageEditText.getText (). ToString ());
— Prags

1
Но что касается ввода пользователя, пользователь не будет пытаться ввести http: // или https: // и просто напишет что-то вроде www.google.com или даже google.com для URL-адреса, но эти случаи не подтверждаются указанным выше решением, я полагаю, что решение должно также включать восприятие тестировщика.
— Шри Кришна

1
ВНИМАНИЕ: Patterns.WEB_URL не распознает URL-адреса localhost.
— Артем Новиков

1
Patterns.WEB_URL не распознает новые доменные имена. например, abc.xyz (с префиксом https: //) (веб-адрес алфавита)
— Чинтан Шах

22
/** 
* 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();
}

4
URL-адрес должен быть в нижнем регистре, иначе Pattern вернет false. просто отправляю сообщение, так что это может кому-то помочь ..
— praveenb

@praveenb в приведенном выше фрагменте кода указывает, что www.website действителен, без .com или .in он возвращает true. не могли бы вы рассказать, как сделать проверку для этого сценария?
— Parth Patel

Почему именно строчные буквы? Пожалуйста, не просто говорите «это необходимо», а также объясните, зачем это нужно!
— Carsten Hagemann

4

В случае, если в вашем 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
}

Это сделало мой день. Спасибо!
— sparkly_frog 08

Спасибо за совет об использовании PatternsCompat для запуска тестов.
— Adi B

2

URLUtil.isValidUrl будет работать, поскольку он существует с уровня API 1.


10
Это неправильный ответ, если вы посмотрите его код . Это просто проверка исходной схемы URL-адреса, а не того, что весь URL-адрес действителен. Вероятно, это одна из худших проверок URL, которые я когда-либо видел
— Майк,

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;

}

-4

Или вы могли бы просто использовать старый добрый Regex

Pattern urlRegex = Pattern.compile("((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww‌​w.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?‌​(?:[\w]*))?)");

Я не говорю, что Patterns.WEB_URLэто плохо, это просто позволяет легко проверить, что соответствует, а что нет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.