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

Pre*_*tam 80 validation url android android-widget android-edittext

我想从Android中获取输入,URL或网站名称,例如www.google.com,EditText用户点击Button要提交,或者当EditText失去焦点时,应该验证URL,例如格式为" www.anyURL.com "......

我怎样才能做到这一点?Android中是否有任何内置功能?

小智 255

简短的回答

在Patterns Class中使用WEB_URL模式

 Patterns.WEB_URL.matcher(potentialUrl).matches()
Run Code Online (Sandbox Code Playgroud)

如果URL有效,它将返回True,如果URL无效,则返回false.

答案很长

从Android API等级8开始,有一个WEB_URL模式.引用来源,它"匹配[RFC]大部分RFC 3987".如果您的目标是较低的API级别,则只需从源代码中复制该模式并将其包含在您的应用程序中.我假设你知道如何使用模式和匹配器,所以我不会在这里详细介绍.

另外,类URLUtil提供了一些有用的方法,如:

这些方法的描述并不十分精细,因此您最好查看来源并找出哪一个最适合您的目的.

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

或使用TextWatcher,我认为会更好.

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

 URLUtil.isValidUrl(url)
Run Code Online (Sandbox Code Playgroud)

因为它将像"http://"这样的字符串作为有效的URL而不是真的

  • 如果你查看URLUtil的源代码,isValidUrl()和isHttpUrl()基本上与startsWith("http://")相同,所以要小心使用它们,因为你可能得不到你想要的结果.使用WEB_URL模式更适合验证URL. (13认同)
  • 小心:Patterns.WEB_URL 无法识别“localhost”url。 (2认同)
  • Patterns.WEB_URL 无法识别新域名。例如 https://abc.xyz/(以 https:// 作为前缀)(Alphabet 的 Web URL) (2认同)

Sha*_*til 18

/** 
* 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();
}
Run Code Online (Sandbox Code Playgroud)

  • Web网址必须为小写,否则Pattern返回false.只是张贴,所以它可能会帮助某人.. (4认同)

Hes*_*sam 5

以防万一,在您的 UnitTest 中,您NullPointerException将使用PatternsCompat而不是Patterns.

fun isFullPath(potentialUrl: String): Boolean {
    return PatternsCompat.WEB_URL.matcher(potentialUrl.toLowerCase(Locale.CANADA)).matches()
}
Run Code Online (Sandbox Code Playgroud)

另外,我意识到true当我通过它时这个方法会返回Photo.jpg。我的期望是false。因此,我建议以下方法而不是上述方法。

fun isFullPath(potentialUrl: String): Boolean {
    try {
        URL(potentialUrl).toURI()
        return true
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)