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

如何在Android中验证EditText中的URL/网站名称?,android,validation,url,android-edittext,android-widget,Android,Validation,Url,Android Edittext,Android Widget,我想从Android中的EditText获取输入,一个URL或一个网站名,比如www.google.com,然后在用户点击按钮提交,或者当EditText失去焦点时,URL应该被验证, 就像它的格式是“www.anyURL.com” 我该怎么做?android中是否有内置功能?简短回答 在Patterns类中使用WEB_URL模式 Patterns.WEB_URL.matcher(potentialUrl).matches() 如果URL有效,则返回True;如果URL无效,则返回false

我想从Android中的
EditText
获取输入,一个URL或一个网站名,比如www.google.com,然后在用户点击
按钮提交,或者当
EditText
失去焦点时,URL应该被验证, 就像它的格式是“www.anyURL.com”

我该怎么做?android中是否有内置功能?

简短回答 在Patterns类中使用WEB_URL模式

 Patterns.WEB_URL.matcher(potentialUrl).matches()
如果URL有效,则返回True;如果URL无效,则返回false

长话短说 从Android API级别8开始,就有了一个模式。引用来源,它“匹配RFC 3987的大部分”。如果您的目标是较低的API级别,那么您可以简单地从源代码复制模式并将其包含在应用程序中。我假设您知道如何使用模式和匹配器,所以我不在这里详细介绍

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

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

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

  • ,或
或者使用a,我认为这会更好

不要使用URLUtil验证URL,如下所示

 URLUtil.isValidUrl(url)
因为它提供了像“http://”这样的字符串作为无效URL,而这不是真的

将起作用,因为它从api级别1开始就存在。

或者您可以只
Regex

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

我并不是说
模式.WEB\u URL
不好,它只是让匹配的内容与不匹配的内容匹配。

在网站验证中使用此正则表达式

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;

}

在这种情况下,在单元测试中,您得到了
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的源代码,isvalidull()和ishttpull()基本上与startsWith(“http://”)相同,因此使用它们时要小心,因为可能无法获得所需的结果。使用WEB_URL模式更适合验证URL.URLUtil.isValidUrl(downloadImageEditText.getText().toString());但就用户输入而言,用户不会尝试键入“http://”或“https://”,只会为url编写类似www.google.com甚至google.com的内容,但上述解决方案无法验证这些情况,我想解决方案还需要包括测试人员的感知。小心:Patterns.WEB\u url无法识别“localhost”URL.Patterns.WEB_URL不识别新域名。例如(以https://作为前缀)(字母表的WEB URL)这应该不是正确的答案。它只是检查URL的初始方案,而不是检查整个URL是否有效。这可能是我见过的最糟糕的URL验证之一Web URL必须是小写的,否则模式返回false。只是发布,所以可能会帮助某人..@praveenb上面的代码片段给出www.website是valid,不带.com或.in,返回true。您能告诉我如何对此场景进行验证吗?为什么它必须是小写的?请不要只说“这是必需的”,还要解释为什么需要它!这让我很开心。谢谢!感谢您提供有关使用PatternsCompat运行测试的提示。