jak zweryfikować adres URL / nazwę witryny w EditText w systemie Android?


85

Chcę wprowadzić dane wejściowe, adres URL lub po prostu nazwę witryny, taką jak www.google.com, z systemu EditTextAndroid i po kliknięciu przez użytkownika przycisku, Buttonaby przesłać lub gdy EditTextstraci fokus, adres URL powinien zostać zweryfikowany, tak jak ma format " www.anyURL.com ”...

Jak mogę to zrobić? Czy w systemie Android są dostępne jakieś wbudowane funkcje?

Odpowiedzi:


275

Krótka odpowiedź

Użyj wzorca WEB_URL w klasie Patterns

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

Zwróci True, jeśli adres URL jest prawidłowy, lub false, jeśli URL jest nieprawidłowy .

Długa odpowiedź

Od poziomu 8 interfejsu API systemu Android istnieje wzorzec WEB_URL . Cytując źródło, jest ono „zgodne z większością części RFC 3987”. Jeśli celujesz w niższy poziom API, możesz po prostu skopiować wzorzec ze źródła i dołączyć go do aplikacji. Zakładam, że wiesz, jak używać wzorców i dopasowań, więc nie będę tutaj wchodził w szczegóły.

Również klasa URLUtil udostępnia kilka przydatnych metod, np .:

Opisy metod nie są zbyt rozbudowane, dlatego prawdopodobnie najlepiej przyjrzeć się źródłu i zastanowić się, która z nich najlepiej pasuje do Twojego celu.

Jeśli chodzi o to, kiedy uruchomić sprawdzanie poprawności, istnieje wiele możliwości: możesz użyć funkcji wywołania zwrotnego EditText

lub użyj TextWatchera , który moim zdaniem byłby lepszy.

NIE UŻYWAJ URLUtil do weryfikacji adresu URL, jak poniżej.

 URLUtil.isValidUrl(url)

ponieważ podaje ciągi takie jak „http: //” jako prawidłowy adres URL, który nie jest prawdziwy


16
Jeśli spojrzysz na źródło URLUtil, isValidUrl () i isHttpUrl () są w zasadzie takie same, jak startedWith ("http: //"), więc uważaj, używając ich, ponieważ możesz nie uzyskać pożądanych wyników. Używanie wzorca WEB_URL znacznie lepiej sprawdza się przy sprawdzaniu poprawności adresów URL.
Dave

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

1
Ale jeśli chodzi o dane wejściowe użytkownika, nie będzie on próbował wpisywać „http: //” lub „https: //” i po prostu napisze coś takiego jak www.google.com lub nawet google.com jako adres URL, ale te przypadki nie są sprawdzane przez powyższe rozwiązanie, myślę, że rozwiązanie musi również uwzględniać percepcję testera.
Sri Krishna

1
OSTROŻNIE: Patterns.WEB_URL nie rozpoznaje adresów URL „localhost”.
Artem Novikov

1
Patterns.WEB_URL nie rozpoznaje nowych nazw domen. np. abc.xyz (z https: // jako prefiksem) (internetowy adres URL alfabetu)
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
Adres URL musi być zapisany małymi literami, w przeciwnym razie wzorzec zwraca fałsz. tylko wysyłanie, więc może to komuś pomóc ..
praveenb

@praveenb powyższy fragment kodu wskazuje, że www.website jest prawidłowa, bez .com lub .in zwraca prawdę. czy możesz powiedzieć, jak przeprowadzić walidację w tym scenariuszu?
Parth Patel

Dlaczego dokładnie musi to być małe? Nie mów tylko „to jest potrzebne”, ale także wyjaśnij, dlaczego jest to potrzebne!
Carsten Hagemann

4

Na wypadek, gdybyś w swoim UnitTestu NullPointerExceptionużywał PatternsCompatzamiast Patterns.

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

Zrozumiałem również, że ta metoda wraca, truegdy ją przejdę Photo.jpg. Moje oczekiwania to false. Dlatego proponuję następującą metodę zamiast powyższej.

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

To po prostu mnie ucieszyło. Dziękuję Ci!
sparkly_frog

Dziękujemy za wskazówkę dotyczącą używania PatternsCompat do uruchamiania testów.
Adi B

2

URLUtil.isValidUrl będzie działać, ponieważ istnieje od poziomu interfejsu API 1.


10
To nie powinna być dobra odpowiedź, jeśli spojrzysz na jej kod . To tylko sprawdzenie początkowego schematu adresu URL, a nie sprawdzenie całego adresu URL. Jest to prawdopodobnie jedna z najgorszych weryfikacji adresów URL, jakie widziałem
Mike,

1

Użyj tego wyrażenia regularnego do weryfikacji swojej witryny

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

Albo możesz po prostu użyć starego dobrego 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]*))?)");

Nie mówię, że Patterns.WEB_URLto źle, po prostu ułatwia to sprawdzenie, co jest dopasowane, a co nie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.