Resposta curta
Use o padrão WEB_URL na classe de padrões
Patterns.WEB_URL.matcher(potentialUrl).matches()
Ele retornará True se o URL for válido e falso se o URL for inválido .
Resposta longa
A partir da API Android nível 8, há um padrão WEB_URL . Citando a fonte, "corresponde à maior parte do RFC 3987". Se você visar um nível de API inferior, poderá simplesmente copiar o padrão da origem e incluí-lo em seu aplicativo. Presumo que você saiba como usar padrões e correspondências, então não entrarei em mais detalhes aqui.
Além disso, a classe URLUtil fornece alguns métodos úteis, por exemplo:
As descrições dos métodos não são muito elaboradas, portanto, provavelmente é melhor você olhar a fonte e descobrir qual deles se encaixa melhor no seu propósito.
Quanto a quando acionar a verificação de validação, existem várias possibilidades: você pode usar as funções de retorno de chamada EditText
ou use um TextWatcher , que acho que seria melhor.
NÃO USE URLUtil para validar o URL conforme abaixo.
URLUtil.isValidUrl(url)
porque fornece strings como "http: //" como URL válido que não é verdadeiro
/** * 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(); }
fonte
No caso, em seu UnitTest, você conseguiu
NullPointerException
usar emPatternsCompat
vez dePatterns
.fun isFullPath(potentialUrl: String): Boolean { return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches() }
Além disso, percebi que esse método retorna
true
quando eu o passoPhoto.jpg
. Minha expectativa éfalse
. Portanto, proponho o seguinte método em vez do acima.fun isFullPath(potentialUrl: String): Boolean { try { URL(potentialUrl).toURI() return true } catch (e: Exception) { e.printStackTrace() } return false }
fonte
URLUtil.isValidUrl funcionará, pois existe desde o nível 1 da API.
fonte
Use este regex na validação do seu site
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; }
fonte
Ou você poderia apenas usar o bom e velho
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]*))?)");
Não estou dizendo que isso
Patterns.WEB_URL
é ruim, apenas torna mais fácil testar o que é correspondido e o que não é.fonte