come convalidare un URL / nome di un sito Web in EditText in Android?


86

Voglio ricevere un input, un URL o solo il nome di un sito Web come www.google.com da EditTextAndroid e l'utente fa clic su Buttonper inviare o quando EditTextperde il focus l'URL deve essere convalidato, come se fosse nel formato " www.anyURL.com "...

Come posso fare questo? C'è qualche funzionalità integrata disponibile in Android?

Risposte:


279

Risposta breve

Usa il pattern WEB_URL nella classe Patterns

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

Restituirà True se l'URL è valido e falso se l'URL non è valido .

Risposta lunga

A partire dal livello 8 dell'API Android, esiste un pattern WEB_URL . Citando la fonte, "corrisponde alla maggior parte della RFC 3987". Se scegli come target un livello API inferiore, potresti semplicemente copiare il pattern dall'origine e includerlo nella tua applicazione. Presumo che tu sappia come usare modelli e abbinamenti, quindi non entrerò in maggiori dettagli qui.

Anche la classe URLUtil fornisce alcuni metodi utili, ad esempio:

Le descrizioni dei metodi non sono molto elaborate, quindi probabilmente è meglio guardare la fonte e capire quale si adatta meglio al tuo scopo.

Per quanto riguarda quando attivare il controllo di convalida, ci sono più possibilità: potresti usare le funzioni di callback EditText

o usa un TextWatcher , che penso sarebbe meglio.

NON USARE URLUtil per convalidare l'URL come di seguito.

 URLUtil.isValidUrl(url)

perché fornisce stringhe come "http: //" come URL valido che non è vero


16
Se guardi l'origine di URLUtil, isValidUrl () e isHttpUrl () sono fondamentalmente gli stessi di startsWith ("http: //") quindi fai attenzione a usarli poiché potresti non ottenere i risultati desiderati. L'uso del pattern WEB_URL è molto più adatto alla convalida degli URL.
Dave

URLUtil.isValidUrl (downloadImageEditText.getText (). ToString ());
Braies

1
Ma per quanto riguarda l'input dell'utente, l'utente non proverà a digitare "http: //" o "https: //" e scriverà semplicemente qualcosa come www.google.com o anche google.com per un URL, ma questi casi non vengono convalidati dalla soluzione di cui sopra, immagino che la soluzione debba includere anche la percezione del tester.
Sri Krishna

1
ATTENZIONE: Patterns.WEB_URL non riconosce gli URL "localhost".
Artem Novikov

1
Patterns.WEB_URL non riconosce i nuovi nomi di dominio. ad esempio abc.xyz (con https: // come prefisso) (URL Web di Alphabet)
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
L'URL web deve essere in minuscolo, altrimenti Pattern restituisce false.
sto

@praveenb sopra lo snippet di codice indica che www.website è valido, senza .com o .in restituisce true. puoi per favore dire come fare la convalida per questo scenario?
Parth Patel

Perché esattamente deve essere minuscolo? Per favore, non limitarti a dire "questo è necessario", spiega anche perché è necessario!
Carsten Hagemann

4

Nel caso in cui, nel tuo UnitTest, hai NullPointerExceptionquindi usato al PatternsCompatposto di Patterns.

fun isFullPath(potentialUrl: String): Boolean {
    return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches()
}

Inoltre, mi sono reso conto che questo metodo ritorna truequando lo passo Photo.jpg. La mia aspettativa è false. Pertanto, propongo il seguente metodo invece di quanto sopra.

fun isFullPath(potentialUrl: String): Boolean {
    try {
        URL(potentialUrl).toURI()
        return true
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}

Questo ha appena reso la mia giornata. Grazie!
sparkly_frog

Grazie per il suggerimento sull'utilizzo di PatternsCompat per eseguire i test.
Adi B

2

URLUtil.isValidUrl funzionerà poiché esiste dal livello api 1.


10
Questa non dovrebbe essere la risposta giusta se guardi il codice . Sta solo controllando lo schema iniziale dell'URL, non che l'intero URL sia valido. Questa è probabilmente una delle peggiori convalide URL che ho visto
Mike

1

Usa questa regex per la convalida del tuo sito web

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

O potresti semplicemente usare il buon vecchio 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]*))?)");

Non sto dicendo che Patterns.WEB_URLsia un male, semplicemente rende facile testare cosa viene abbinato e cosa no.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.