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.