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

86

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

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

Preetam
источник

Ответы:

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это плохо, это просто позволяет легко проверить, что соответствует, а что нет.

Матас Вайткявичюс
источник