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

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

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



답변

짧은 답변

패턴 클래스에서 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 : //”와 같은 문자열을 제공하기 때문입니다.


답변

/**
* 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();
}


답변

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


답변

URLUtil.isValidUrl 은 API 레벨 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;

}


답변

아니면 그냥 좋은 옛날을 사용할 수 있습니다 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그것이 나쁘다고 말하는 것이 아니라 일치되는 것과 일치하지 않는 것을 쉽게 테스트수 있도록합니다 .


답변