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
/** * 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(); }
źródło
Na wypadek, gdybyś w swoim UnitTestu
NullPointerException
używałPatternsCompat
zamiastPatterns
.fun isFullPath(potentialUrl: String): Boolean { return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches() }
Zrozumiałem również, że ta metoda wraca,
true
gdy ją przejdęPhoto.jpg
. Moje oczekiwania tofalse
. 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 }
źródło
URLUtil.isValidUrl będzie działać, ponieważ istnieje od poziomu interfejsu API 1.
źródło
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; }
źródło
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]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)");
Nie mówię, że
Patterns.WEB_URL
to źle, po prostu ułatwia to sprawdzenie, co jest dopasowane, a co nie.źródło