如何在Android中验证EditText中的URL/网站名称?
我想从Android中的如何在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
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]+)?|(?:www.|[-;:&=\+\$,\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运行测试的提示。