วิธีตรวจสอบ URL / ชื่อเว็บไซต์ใน EditText ใน Android


86

ฉันต้องการป้อนข้อมูล URL หรือเพียงชื่อเว็บไซต์เช่นwww.google.comจากEditTextใน Android และเมื่อผู้ใช้คลิกที่Buttonเพื่อส่งหรือเมื่อEditTextจุดโฟกัสสูญเสีย URL ควรได้รับการตรวจสอบเช่นเดียวกับในรูปแบบ " www.anyURL.com "...

ฉันจะทำเช่นนี้ได้อย่างไร? มีฟังก์ชัน inbuilt ใน Android หรือไม่?

คำตอบ:


279

คำตอบสั้น ๆ

ใช้รูปแบบ WEB_URL ในคลาส Patterns

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

มันจะกลับมาจริงถ้า URL ที่ถูกต้องและเป็นเท็จหาก URL ไม่ถูกต้อง

คำตอบยาว

ตั้งแต่ Android API ระดับ 8 มีรูปแบบWEB_URL การอ้างแหล่งที่มามัน "ตรงกับ [es] ส่วนใหญ่ของ RFC 3987" หากคุณกำหนดเป้าหมายระดับ API ที่ต่ำกว่าคุณสามารถคัดลอกรูปแบบจากแหล่งที่มาและรวมไว้ในแอปพลิเคชันของคุณได้ ฉันถือว่าคุณรู้วิธีใช้รูปแบบและตัวจับคู่ดังนั้นฉันจะไม่ลงรายละเอียดเพิ่มเติมที่นี่

นอกจากนี้คลาสURLUtilยังมีวิธีการที่มีประโยชน์เช่น:

คำอธิบายของวิธีการนั้นไม่ได้มีรายละเอียดมากนักดังนั้นคุณน่าจะดีที่สุดในการดูแหล่งที่มาและค้นหาว่าวิธีใดที่เหมาะกับวัตถุประสงค์ของคุณมากที่สุด

สำหรับเวลาที่จะเรียกใช้การตรวจสอบความถูกต้องมีความเป็นไปได้หลายประการ: คุณสามารถใช้ฟังก์ชันการเรียกกลับ EditText

หรือใช้TextWatcherซึ่งฉันคิดว่าน่าจะดีกว่า

อย่าใช้ URLUtil เพื่อตรวจสอบความถูกต้องของ URL ดังต่อไปนี้

 URLUtil.isValidUrl(url)

เนื่องจากให้สตริง "http: //" เป็น URL ที่ถูกต้องซึ่งไม่เป็นความจริง


16
หากคุณดูที่มาของ URLUtil isValidUrl () และ isHttpUrl () โดยพื้นฐานแล้วจะเหมือนกับ startWith ("http: //") ดังนั้นโปรดใช้ความระมัดระวังเนื่องจากคุณอาจไม่ได้ผลลัพธ์ที่ต้องการ การใช้รูปแบบ WEB_URL เหมาะกับการตรวจสอบความถูกต้องของ URL มากกว่ามาก
Dave

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

1
แต่เท่าที่ผู้ใช้ป้อนข้อมูลผู้ใช้จะไม่พยายามพิมพ์ "http: //" หรือ "https: //" และเพียงแค่เขียนบางอย่างเช่น www.google.com หรือแม้แต่ google.com สำหรับ URL แต่กรณีเหล่านี้ไม่ได้รับการตรวจสอบความถูกต้องโดยวิธีแก้ปัญหาข้างต้นฉันเดาว่าการแก้ปัญหาต้องรวมถึงการรับรู้ของผู้ทดสอบด้วย
Sri Krishna

1
ข้อควรระวัง: Patterns.WEB_URL ไม่รู้จัก URL "localhost"
Artem Novikov

1
Patterns.WEB_URL ไม่รู้จักชื่อโดเมนใหม่ เช่นabc.xyz (มี https: // เป็นคำนำหน้า) (Web URL of Alphabet)
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 ของเว็บต้องเป็นตัวพิมพ์เล็กมิฉะนั้น Pattern จะแสดงผลเท็จ แค่โพสต์ก็คงช่วยใครได้
บ้าง

@praveenb ด้านบนข้อมูลโค้ดทำให้ www.website ถูกต้องโดยไม่มี. com หรือ. ในนั้นส่งคืนจริง คุณช่วยบอกวิธีตรวจสอบความถูกต้องสำหรับสถานการณ์นี้ได้ไหม
Parth Patel

ทำไมต้องเป็นตัวพิมพ์เล็ก? อย่าเพิ่งพูดว่า "จำเป็น" อธิบายด้วยว่าทำไมจึงจำเป็น!
Carsten Hagemann

4

ในกรณีนี้ใน UnitTest ของคุณคุณได้NullPointerExceptionใช้PatternsCompatแทนPatternsไฟล์.

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

นอกจากนี้ฉันตระหนักว่าวิธีนี้จะคืนค่าtrueเมื่อฉันผ่านมันPhoto.jpgไป falseคาดหวังของฉัน ดังนั้นจึงขอเสนอวิธีการดังต่อไปนี้แทนวิธีการข้างต้น

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

นี่ทำให้วันของฉัน ขอขอบคุณ!
sparkly_frog

ขอขอบคุณสำหรับเคล็ดลับเกี่ยวกับการใช้ PatternsCompat เพื่อเรียกใช้การทดสอบ
Adi B

2

URLUtil.isValidUrlจะทำงานเนื่องจากมีอยู่ตั้งแต่ระดับ api 1


10
นี้ไม่ควรเป็นคำตอบที่เหมาะสมถ้าคุณดูรหัสที่มัน เป็นเพียงการตรวจสอบรูปแบบเริ่มต้นของ URL ไม่ใช่ว่า URL ทั้งหมดถูกต้อง นี่อาจเป็นการตรวจสอบ URL ที่แย่ที่สุดครั้งหนึ่งที่ฉันเคยเห็น
Mike

1

ใช้นิพจน์นี้ในการตรวจสอบเว็บไซต์ของคุณ

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

หรือจะใช้ของเก่าก็ได้ 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]*))?)");

ฉันไม่ได้บอกว่าPatterns.WEB_URLมันไม่ดีมันทำให้ง่ายต่อการทดสอบว่าอะไรที่ตรงกันและอะไรไม่เข้ากัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.