¿Cómo validar un nombre de URL / sitio web en EditText en Android?


85

Quiero tomar una entrada, una URL o simplemente el nombre de un sitio web como www.google.com desde EditTextAndroid y el usuario hace clic en Buttonpara enviar o cuando EditTextpierde el enfoque, la URL debe validarse, como si estuviera en el formato " www.anyURL.com "...

¿Cómo puedo hacer esto? ¿Hay alguna funcionalidad incorporada disponible en Android?

Respuestas:


275

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


16
Si observa el origen de URLUtil, isValidUrl () e isHttpUrl () son básicamente lo mismo que startsWith ("http: //"), así que tenga cuidado al usarlos, ya que es posible que no obtenga los resultados que desea. El uso del patrón WEB_URL es mucho más adecuado para validar URL.
— Dave

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

1
Pero en lo que respecta a la entrada del usuario, el usuario no intentará escribir "http: //" o "https: //" y simplemente escribiría algo como www.google.com o incluso google.com para una URL, pero estos casos no están siendo validados por la solución anterior, supongo que la solución también debe incluir la percepción del evaluador.
— Sri Krishna

1
CUIDADO: Patterns.WEB_URL no reconoce las URL de "localhost".
— Artem Novikov

1
Patterns.WEB_URL no reconoce nuevos nombres de dominio. por ejemplo, abc.xyz (con https: // como prefijo) (URL web del alfabeto)
— 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
La URL web debe estar en minúsculas; de lo contrario, el patrón devuelve falso. sólo publicar, por lo que puede ayudar a alguien ..
— praveenb

@praveenb el fragmento de código anterior indica que www.website es válido, sin .com o .in devuelve verdadero. ¿Puede decirnos cómo realizar la validación para este escenario?
— Parth Patel

¿Por qué exactamente debe estar en minúsculas? Por favor, no diga simplemente "esto es necesario", ¡también explique por qué es necesario!
— Carsten Hagemann

4

En caso de que, en su UnitTest, se NullPointerExceptionuse en PatternsCompatlugar de Patterns.

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 truecuando lo paso Photo.jpg. Mi expectativa es false. 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
}

Esto me hizo el día. ¡Gracias!
— sparkly_frog

Gracias por el consejo sobre el uso de PatternsCompat para ejecutar pruebas.
— Adi B

2

URLUtil.isValidUrl funcionará ya que existe desde el nivel 1 de la API.


10
Esta no debería ser la respuesta correcta si miras el código . Es solo verificar el esquema inicial de la URL, no que toda la URL sea válida. Esta es probablemente una de las peores validaciones de URL que he visto
— Mike

1

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;

}

-4

O podrías usar el buen viejo 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]*))?)");

No estoy diciendo que eso Patterns.WEB_URLsea ​​malo, solo hace que sea fácil probar qué coincide y qué no.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.