Android'de EditText'te bir URL / web sitesi adı nasıl doğrulanır?


86

Ben girdi, gibi bir URL ya da sadece bir web sitesi adı, almak istediğiniz www.google.com dan EditTextAndroid'de ve üzerinde kullanıcı tıkladığında Buttonzaman sunması veya EditText"odak kaybeder o formatında gibi URL, doğrulanması gereken www.anyURL.com "...

Bunu nasıl yapabilirim? Android'de herhangi bir dahili işlev var mı?

Yanıtlar:


279

Kısa cevap

Kalıp Sınıfında WEB_URL kalıbını kullanın

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

Bu dönecektir URL geçerli ise TRUE ve URL geçersizse yanlış .

Uzun cevap

Android API seviyesi 8'den itibaren bir WEB_URL kalıbı vardır. Kaynaktan alıntı yapıldığında, "RFC 3987'nin çoğuyla eşleşiyor". Daha düşük bir API seviyesini hedeflerseniz, kalıbı kaynaktan kopyalayıp uygulamanıza dahil edebilirsiniz. Kalıpları ve eşleştiricileri nasıl kullanacağınızı bildiğinizi varsayıyorum, bu yüzden burada daha fazla ayrıntıya girmeyeceğim.

Ayrıca, URLUtil sınıfı bazı yararlı yöntemler sağlar, örneğin:

Yöntemlerin açıklamaları çok ayrıntılı değildir, bu nedenle muhtemelen kaynağa bakmak ve hangisinin amacınıza en uygun olduğunu bulmak konusunda en iyisisiniz.

Doğrulama kontrolünün ne zaman tetikleneceğine gelince, birden fazla olasılık vardır: EditText geri arama işlevlerini kullanabilirsiniz.

veya daha iyi olacağını düşündüğüm bir TextWatcher kullanın .

DO NOT USE URLUtil aşağıdaki gibi URL'yi doğrulamak için.

 URLUtil.isValidUrl(url)

çünkü "http: //" gibi dizeleri geçerli URL olarak verir ve bu doğru değildir


16
URLUtil için kaynağa bakarsanız, isValidUrl () ve isHttpUrl () temelde beginWith ("http: //") ile aynıdır, bu yüzden istediğiniz sonuçları alamayabileceğiniz için bunları kullanırken dikkatli olun. WEB_URL kalıbını kullanmak, url'leri doğrulamak için çok daha uygundur.
Dave

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

1
Ancak kullanıcı girdisi söz konusu olduğunda, kullanıcı "http: //" veya "https: //" yazmayı denemeyecek ve bir url için www.google.com veya hatta google.com gibi bir şey yazacaktır. ancak bu durumlar yukarıdaki çözümle doğrulanmıyor, sanırım çözümün test edenin algısını da içermesi gerekiyor.
Sri Krishna

1
DİKKATLİ: Patterns.WEB_URL, "localhost" url'lerini tanımaz.
Artem Novikov

1
Patterns.WEB_URL yeni alan adlarını tanımıyor. örn. abc.xyz (https: // önek olarak) (
Alfabenin

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
Web url'si küçük harf olmalıdır, aksi takdirde desen yanlış döndürür. sadece gönderme, bu yüzden birine yardımcı olabilir ..
praveenb

@praveenb yukarıdaki kod parçacığı www.website'nin geçerli olduğunu, .com veya .in olmadan true değerini verir. Lütfen bu senaryo için nasıl doğrulama yapacağınızı söyler misiniz?
Parth Patel

Neden tam olarak küçük harf olmalı? Lütfen sadece "buna ihtiyaç var" demeyin, ayrıca neden gerekli olduğunu da açıklayın!
Carsten Hagemann

4

Durumda, UnitTest'inizde, yerine NullPointerExceptionkullanın .PatternsCompatPatterns

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

Ayrıca, bu yöntem döndürür fark truebunu geçerken Photo.jpg. Benim beklentim false. Bu nedenle, yukarıdakilerin yerine aşağıdaki yöntemi öneriyorum.

fun isFullPath(potentialUrl: String): Boolean {
    try {
        URL(potentialUrl).toURI()
        return true
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}

Bu sadece günümü güzelleştirdi. Teşekkür ederim!
sparkly_frog

Testleri çalıştırmak için PatternsCompat kullanımıyla ilgili ipucu için teşekkür ederiz.
Adi B

2

URLUtil.isValidUrl , api seviyesi 1'den beri var olduğu için çalışacaktır.


10
Koduna bakarsanız bu doğru cevap olmamalıdır . Sadece URL'nin ilk şemasını kontrol ediyor, URL'nin tamamının geçerli olup olmadığını değil. Bu muhtemelen gördüğüm en kötü URL doğrulamalarından biri
Mike

1

Bu normal ifadeyi web sitenizin doğrulamasında kullanın

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

Ya da sadece eskiyi kullanabilirsin 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]*))?)");

Bunun Patterns.WEB_URLkötü olduğunu söylemiyorum , sadece neyin eşleşip neyin eşleşmediğini test etmeyi kolaylaştırıyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.