Android의 EditText에서 URL / 웹 사이트 이름을 확인하는 방법은 무엇입니까?


85

입력, URL 또는 웹 사이트 이름 (예 : www.google.com ) EditText을 Android에서 가져오고 사용자가를 클릭 Button하여 제출하거나 EditText초점이 맞지 않으면 URL이 "형식으로 확인되어야합니다." www.anyURL.com "...

어떻게 할 수 있습니까? Android에서 사용할 수있는 내장 기능이 있습니까?

답변:


275

짧은 답변

패턴 클래스에서 WEB_URL 패턴 사용

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

그것은 반환 URL이 유효한 경우는 true를 하고 URL이 유효하지 않은 경우는 false .

긴 대답

Android API 레벨 8 부터 WEB_URL 패턴이 있습니다. 출처를 인용하면 "RFC 3987의 대부분과 일치"합니다. 더 낮은 API 레벨을 대상으로하는 경우 소스에서 패턴을 복사하여 애플리케이션에 포함하기 만하면됩니다. 패턴과 매처를 사용하는 방법을 알고 있다고 가정하므로 여기서 더 자세히 설명하지 않겠습니다.

또한 URLUtil 클래스 는 다음과 같은 몇 가지 유용한 메소드를 제공합니다.

방법에 대한 설명은 그다지 정교하지 않으므로 소스를보고 어떤 방법이 자신의 목적에 가장 적합한 지 알아내는 것이 가장 좋습니다.

유효성 검사를 트리거하는 경우에는 여러 가지 가능성이 있습니다. EditText 콜백 함수를 사용할 수 있습니다.

또는 TextWatcher를 사용하십시오 .

아래와 같이 URL을 확인하기 위해 URLUtil사용하지 마십시오 .

 URLUtil.isValidUrl(url)

사실이 아닌 유효한 URL로 "http : //"와 같은 문자열을 제공하기 때문입니다.


16
URLUtil의 소스를 살펴보면 isValidUrl () 및 isHttpUrl ()은 기본적으로 startsWith ( "http : //")와 동일하므로 원하는 결과를 얻지 못할 수 있으므로주의해서 사용하십시오. WEB_URL 패턴을 사용하는 것이 URL 유효성 검사에 훨씬 더 적합합니다.
Dave

URLUtil.isValidUrl (downloadImageEditText.getText (). toString ());
Prags 2015-04-23

1
그러나 사용자 입력에 관한 한 사용자는 'http : //'또는 'https : //'를 입력하지 않고 URL에 www.google.com 또는 google.com과 같은 것을 작성합니다. 그러나 이러한 경우는 위의 솔루션에 의해 검증되지 않으며 솔루션에 테스터의 인식도 포함되어야한다고 생각합니다.
Sri Krishna

1
주의 : Patterns.WEB_URL은 "localhost"URL을 인식하지 못합니다.
Artem Novikov

1
Patterns.WEB_URL은 새 도메인 이름을 인식하지 못합니다. 예 : abc.xyz (https : // 접두사 사용) (알파벳의 웹 URL)
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은 소문자 여야하며 그렇지 않으면 패턴이 false를 반환합니다. 이 사람을 도움이 될 수 있도록 그냥 게시 ..
praveenb

코드 스 니펫 위의 @praveenb는 www.website가 유효하며 .com 또는 .in없이 true를 반환합니다. 이 시나리오에 대한 유효성 검사 방법을 알려주시겠습니까?
Parth 파텔

정확히 소문자 여야하는 이유는 무엇입니까? "이것이 필요합니다"라고 말하지 말고 왜 필요한지 설명하십시오!
Carsten Hagemann

4

경우에, 당신의 유닛 테스트에서, 당신이있어 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


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.