làm cách nào để xác thực URL / tên trang web trong EditText trong Android?


85

Tôi muốn lấy đầu vào, một URL hoặc chỉ một tên trang web như, www.google.com từ EditTexttrong Android và khi người dùng nhấp vào Buttonđể gửi hoặc khi EditTextmất tiêu điểm, URL sẽ được xác thực, giống như ở định dạng " www.anyURL.com "...

Tôi có thể làm cái này như thế nào? Có bất kỳ chức năng sẵn có nào trong Android không?

Câu trả lời:


275

Câu trả lời ngắn

Sử dụng mẫu WEB_URL trong Lớp mẫu

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

Nó sẽ trả về True nếu URL hợp lệfalse nếu URL không hợp lệ .

Câu trả lời dài

Kể từ API Android cấp 8, có mẫu WEB_URL . Trích dẫn nguồn, nó "phù hợp với hầu hết các phần của RFC 3987". Nếu bạn nhắm mục tiêu một cấp API thấp hơn, bạn có thể chỉ cần sao chép mẫu từ nguồn và đưa vào ứng dụng của mình. Tôi cho rằng bạn biết cách sử dụng các mẫu và bộ so khớp, vì vậy tôi không đi sâu vào chi tiết hơn ở đây.

Ngoài ra, lớp URLUtil cung cấp một số phương thức hữu ích, ví dụ:

Các mô tả của các phương pháp không quá phức tạp, do đó, bạn có thể tốt nhất nên xem nguồn và tìm ra phương pháp nào phù hợp với mục đích của bạn nhất.

Đối với thời điểm kích hoạt kiểm tra xác thực, có nhiều khả năng: bạn có thể sử dụng các hàm gọi lại EditText

hoặc sử dụng TextWatcher , mà tôi nghĩ sẽ tốt hơn.

KHÔNG SỬ DỤNG URLUtil để xác thực URL như bên dưới.

 URLUtil.isValidUrl(url)

bởi vì nó cung cấp các chuỗi như "http: //" là URL hợp lệ không đúng sự thật


16
Nếu bạn nhìn vào nguồn cho URLUtil, isValidUrl () và isHttpUrl () về cơ bản giống như startedWith ("http: //"), vì vậy hãy cẩn thận khi sử dụng chúng vì bạn có thể không nhận được kết quả mong muốn. Sử dụng mẫu WEB_URL phù hợp hơn nhiều để xác thực url.
Dave

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

1
Nhưng trong chừng mực người dùng nhập, người dùng sẽ không cố nhập 'http: //' hoặc 'https: //' và sẽ chỉ viết một cái gì đó như www.google.com hoặc thậm chí google.com cho một url, nhưng những trường hợp này không được xác thực bởi giải pháp trên, tôi đoán giải pháp cần bao gồm cả nhận thức của người thử nghiệm.
Sri Krishna

1
CẨN THẬN: Patterns.WEB_URL không nhận dạng được url "localhost".
Artem Novikov

1
Patterns.WEB_URL không nhận dạng tên miền mới. ví dụ: abc.xyz (với tiền tố https: //) (URL web của Bảng chữ cái)
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
Url web phải ở dạng chữ thường, nếu không Mẫu trả về false. chỉ cần gửi bài, vì vậy nó có thể giúp ai đó ..
praveenb

@praveenb đoạn mã trên cho biết www.website là hợp lệ, không có .com hoặc .in thì nó trả về true. bạn có thể vui lòng cho biết làm thế nào để xác nhận cho kịch bản này?
Parth Patel

Chính xác tại sao nó phải là chữ thường? Xin đừng chỉ nói "cái này là cần thiết", hãy giải thích tại sao nó cần!
Carsten Hagemann

4

Trong trường hợp, trong UnitTest của bạn, bạn có thể NullPointerExceptionsử dụng PatternsCompatthay vì Patterns.

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

Ngoài ra, tôi nhận ra rằng phương thức này trả về truekhi tôi vượt qua nó Photo.jpg. Kỳ vọng của tôi là false. Do đó, tôi đề xuất phương pháp sau thay vì phương pháp trên.

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

Điều này chỉ làm cho ngày của tôi. Cảm ơn bạn!
sparkly_frog

Cảm ơn về mẹo sử dụng PatternsCompat để chạy thử nghiệm.
Adi B

2

URLUtil.isValidUrl sẽ hoạt động vì nó tồn tại kể từ api cấp 1.


10
Đây không phải là câu trả lời đúng nếu bạn nhìn vào mã của nó . Nó chỉ kiểm tra sơ đồ ban đầu của URL, không phải toàn bộ URL là hợp lệ. Đây có lẽ là một trong những cách xác thực URL tồi tệ nhất mà tôi từng thấy
Mike

1

Sử dụng regex này để xác thực trang web của bạ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

Hoặc bạn có thể chỉ sử dụng cũ tốt 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]*))?)");

Tôi không nói điều đó Patterns.WEB_URLlà xấu, nó chỉ giúp bạn dễ dàng kiểm tra những gì phù hợp và những gì không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.