¿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?

Preetam
fuente

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

Dimi
fuente
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();
}
Shailendra Patil
fuente
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
}
Hesam
fuente
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.

ramita
fuente
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;

}
Nidhi Savaliya
fuente
-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.

Matas Vaitkevicius
fuente