як перевірити URL-адресу / назву веб-сайту в EditText в Android?


85

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

Як я можу це зробити? Чи є в Android вбудована функціональність?

Відповіді:


275

Коротка відповідь

Використовуйте шаблон WEB_URL у класі Шаблони

 Patterns.WEB_URL.matcher(potentialUrl).matches()

Він поверне значення True, якщо URL-адреса є дійсним, і false, якщо URL-адреса недійсна .

Довга відповідь

Що стосується Android API рівня 8, існує шаблон WEB_URL . Цитуючи джерело, воно "відповідає [більшості] більшій частині RFC 3987". Якщо ви націлитесь на нижчий рівень API, ви можете просто скопіювати шаблон із джерела та включити його у свою програму. Я припускаю, що ви знаєте, як використовувати візерунки та збіги, тому я не буду вдаватися до деталей тут.

Також клас URLUtil надає деякі корисні методи, наприклад:

Описи методів не дуже розроблені, тому вам, мабуть, найкраще поглянути на джерело та з'ясувати, який із них найкраще відповідає вашій меті.

Що стосується того, коли запускати перевірку перевірки, існує безліч можливостей: ви можете використовувати функції зворотного виклику EditText

або скористайтеся TextWatcher , що, на мою думку, було б краще.

НЕ ВИКОРИСТОВУЙТЕ URLUtil, щоб перевірити 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
ОБЕРЕЖНО: Шаблони. WEB_URL не розпізнає URL-адреси "localhost".
Артем Новіков,

1
Шаблони.WEB_URL не розпізнає нові доменні імена. напр. abc.xyz (з https: // як префікс) (веб-URL-адреса алфавіту)
Chintan Shah

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
Веб-адреса повинна бути в нижньому регістрі, інакше Шаблон повертає false. просто розміщуючи повідомлення, щоб це могло комусь допомогти ..
praveenb

@praveenb, наведений вище фрагмент коду, дає змогу веб-сайту www.wealth.com без .com або .in повертати true. Ви можете сказати, як зробити перевірку для цього сценарію?
Парт Патель,

Чому саме вона повинна бути малою? Будь ласка, не просто скажіть "це потрібно", а також поясніть, чому це потрібно!
Карстен Хагеманн,

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

Дякуємо за підказку щодо використання PatternsCompat для запуску тестів.
Аді Б

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.