Respuesta corta
Usar el patrón WEB_URL en la clase Patterns
Patterns.WEB_URL.matcher(potentialUrl).matches()
Devolverá True si la URL es válida y falsa si la URL no es válida .
Respuesta larga
A partir del nivel 8 de la API de Android, existe un patrón WEB_URL . Citando la fuente, "coincide con la mayor parte de RFC 3987". Si apunta a un nivel de API más bajo, simplemente puede copiar el patrón de la fuente e incluirlo en su aplicación. Supongo que sabe cómo usar patrones y comparadores, por lo que no voy a entrar en más detalles aquí.
Además, la clase URLUtil proporciona algunos métodos útiles, por ejemplo:
Las descripciones de los métodos no son muy elaboradas, por lo que probablemente sea mejor que busque la fuente y averigüe cuál se adapta mejor a su propósito.
En cuanto a cuándo activar la verificación de validación, existen múltiples posibilidades: puede usar las funciones de devolución de llamada EditText
o use un TextWatcher , que creo que sería mejor.
NO USE URLUtil para validar la URL como se muestra a continuación.
URLUtil.isValidUrl(url)
porque da cadenas como "http: //" como URL válida que no es verdadera
/** * 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(); }
fuente
En caso de que, en su UnitTest, se
NullPointerException
use enPatternsCompat
lugar dePatterns
.fun isFullPath(potentialUrl: String): Boolean { return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches() }
Además, me di cuenta de que este método regresa
true
cuando lo pasoPhoto.jpg
. Mi expectativa esfalse
. Por lo tanto, propongo el siguiente método en lugar del anterior.fun isFullPath(potentialUrl: String): Boolean { try { URL(potentialUrl).toURI() return true } catch (e: Exception) { e.printStackTrace() } return false }
fuente
URLUtil.isValidUrl funcionará ya que existe desde el nivel 1 de la API.
fuente
Utilice esta expresión regular en la validación de su sitio 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; }
fuente
O podrías usar el buen viejo
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]*))?)");
No estoy diciendo que eso
Patterns.WEB_URL
sea malo, solo hace que sea fácil probar qué coincide y qué no.fuente