Wie überprüfe ich einen URL- / Website-Namen in EditText in Android?

84

Ich möchte Eingang nehmen, eine URL oder einfach nur einen Website - Namen wie, www.google.com von EditTextin Android und auf Benutzer , klicken Sie auf den Buttonoder einreichen , wenn der EditTextden Fokus verliert die URL validiert werden soll, wie es in dem Format " www.anyURL.com "...

Wie kann ich das machen? Gibt es eine eingebaute Funktionalität in Android?

Preetam
quelle

Antworten:

272

Kurze Antwort

Verwenden Sie das WEB_URL-Muster in der Musterklasse

 Patterns.WEB_URL.matcher(potentialUrl).matches()

Es wird True zurückgegeben, wenn die URL gültig ist, und false, wenn die URL ungültig ist .

Lange Antwort

Ab Android API Level 8 gibt es ein WEB_URL- Muster. Unter Angabe der Quelle entspricht sie "dem größten Teil von RFC 3987". Wenn Sie eine niedrigere API-Ebene anstreben, können Sie das Muster einfach aus der Quelle kopieren und in Ihre Anwendung aufnehmen. Ich gehe davon aus, dass Sie wissen, wie man Muster und Matcher verwendet, daher werde ich hier nicht näher darauf eingehen.

Auch die Klasse URLUtil bietet einige nützliche Methoden, z.

Die Beschreibungen der Methoden sind nicht sehr ausführlich, daher sollten Sie sich am besten die Quelle ansehen und herausfinden, welche am besten zu Ihrem Zweck passt.

Es gibt mehrere Möglichkeiten, wann die Validierungsprüfung ausgelöst werden soll: Sie können die EditText-Rückruffunktionen verwenden

oder verwenden Sie einen TextWatcher , der meiner Meinung nach besser wäre.

VERWENDEN SIE URLUtil NICHT , um die URL wie folgt zu überprüfen .

 URLUtil.isValidUrl(url)

weil es Zeichenfolgen wie "http: //" als gültige URL gibt, was nicht wahr ist

Dimi
quelle
16
Wenn Sie sich die Quelle für URLUtil ansehen, sind isValidUrl () und isHttpUrl () grundsätzlich mit startWith ("http: //") identisch. Verwenden Sie diese also vorsichtig, da Sie möglicherweise nicht die gewünschten Ergebnisse erhalten. Die Verwendung des WEB_URL-Musters eignet sich viel besser zum Überprüfen von URLs.
Dave
URLUtil.isValidUrl (downloadImageEditText.getText (). ToString ());
Prags
1
Bei den Benutzereingaben wird der Benutzer jedoch nicht versuchen, "http: //" oder "https: //" einzugeben, sondern nur eine URL wie www.google.com oder sogar google.com schreiben. Aber diese Fälle werden von der obigen Lösung nicht validiert. Ich denke, die Lösung muss auch die Wahrnehmung des Testers berücksichtigen.
Sri Krishna
1
VORSICHT: Patterns.WEB_URL erkennt keine "localhost" -URLs.
Artem Novikov
1
Patterns.WEB_URL erkennt keine neuen Domainnamen. zB abc.xyz (mit https: // als Präfix) (Web-URL des Alphabets)
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
quelle
4
Die Web-URL muss in Kleinbuchstaben angegeben werden, andernfalls gibt Pattern false zurück. nur
posten
@praveenb über dem Code-Snippet gibt an, dass www.website gültig ist, ohne .com oder .in gibt es true zurück. Können Sie bitte angeben, wie die Validierung für dieses Szenario durchgeführt werden soll?
Parth Patel
Warum genau muss es Kleinbuchstaben sein? Bitte sagen Sie nicht nur "das ist nötig", sondern erklären Sie auch, warum es nötig ist!
Carsten Hagemann
3

Für den Fall, in Ihrem Unittest, hast du NullPointerExceptiondann verwenden Sie PatternsCompatstatt Patterns.

fun isFullPath(potentialUrl: String): Boolean {
    return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches()
}

Außerdem wurde mir klar, dass diese Methode zurückgegeben wird, truewenn ich sie übergebe Photo.jpg. Meine Erwartung ist false. Daher schlage ich folgende Methode anstelle der oben genannten vor.

fun isFullPath(potentialUrl: String): Boolean {
    try {
        URL(potentialUrl).toURI()
        return true
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}
Hesam
quelle
Das hat mir gerade den Tag gemacht. Danke dir!
sparkly_frog
2

URLUtil.isValidUrl funktioniert, da es seit API-Level 1 existiert.

Zweig
quelle
10
Dies sollte nicht die richtige Antwort sein, wenn Sie sich den Code dafür ansehen . Es wird nur das ursprüngliche URL-Schema überprüft, nicht, dass die gesamte URL gültig ist. Dies ist wahrscheinlich eine der schlechtesten URL-Validierungen, die ich je gesehen habe
Mike
1

Verwenden Sie diesen regulären Ausdruck für die Validierung Ihrer Website

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
quelle
-4

Oder Sie könnten einfach gut alt gebrauchen 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]*))?)");

Ich sage nicht, dass Patterns.WEB_URLdas schlecht ist, es macht es einfach, zu testen, was übereinstimmt und was nicht.

Matas Vaitkevicius
quelle