如何在Android中的EditText中验证URL /网站名称?


85

我想输入一个URL,或者只是一个网站名称,例如Android中的www.google.comEditText然后在用户单击上Button提交,或者在EditText失去焦点时应验证URL,例如格式为“ www.anyURL.com “ ...

我怎样才能做到这一点?android有内置功能吗?

Answers:


275

简短答案

在Patterns类中使用WEB_URL模式

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

如果URL有效,则返回True;如果URL无效,则返回false

长答案

从Android API级别8开始,具有WEB_URL模式。引用源,它“与RFC 3987的大部分匹配”。如果您定位较低的API级别,则可以简单地从源代码中复制模式并将其包含在您的应用程序中。我假设您知道如何使用模式和匹配器,因此在此不再赘述。

URLUtil类还提供了一些有用的方法,例如:

方法的描述不是很详尽,因此您最好查看源代码并找出最适合您目的的方法。

至于何时触发验证检查,有多种可能性:您可以使用EditText回调函数

或使用TextWatcher,我认为效果会更好。

请勿使用 URLUtil 验证URL,如下所示。

 URLUtil.isValidUrl(url)

因为它会提供诸如“ http://”之类的字符串作为有效网址,这是不正确的


16
如果查看URLUtil的来源,则isValidUrl()和isHttpUrl()与startsWith(“ http://”)基本上相同,因此请小心使用它们,因为可能无法获得所需的结果。使用WEB_URL模式更适合验证URL。
戴夫

URLUtil.isValidUrl(downloadImageEditText.getText()。toString());
Prags 2015年

1
但是就用户输入而言,用户不会尝试输入“ http://”或“ https://”,而只会为网址写www.google.com甚至google.com之类的内容,但是这些情况并未通过上述解决方案得到验证,我想该解决方案也需要包括测试人员的理解。
斯里克里希纳

1
注意:Patterns.WEB_URL无法识别“ localhost” URL。
Artem Novikov

1
Patterns.WEB_URL无法识别新域名。例如abc.xyz(以https://作为前缀)(字母的Web 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
Web网址必须为小写,否则Pattern返回false。刚刚发布,所以它可以帮助别人..
praveenb

上面的代码片段中的@praveenb给出了www.website是有效的,没有.com或.in则返回true。您能告诉我如何针对这种情况进行验证吗?
Parth Patel

为什么精确地必须将其小写?请不要只说“这是必需的”,还要说明为什么需要它!
卡斯滕·哈格曼

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


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很不好,只是它可以轻松测试匹配的内容和不匹配的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.