在Android开发中判断输入是否为合法的URL可以使用以下几种方法,涵盖字符串验证、正则表达式和系统API等方式:
1. 正则表达式验证
通过正则匹配URL格式,以下是一个基础的正则示例:
java
private boolean isValidUrl(String url) {
String regex = "^(https?|ftp)://[\\w-]+(\\.[\\w-]+)+([\\w-.,@?^=%&:/~+#]*[\\w@?^=%&/~+#])?$";
return Pattern.matches(regex, url.trim());
}
该正则支持`http`/`https`/`ftp`协议,要求包含域名和路径。可根据需求调整,如允许无协议头或限制特定域名后缀。
2. Android系统API验证
使用`android.webkit.URLUtil`工具类,提供快速验证:
java
boolean isValid = URLUtil.isValidUrl(url) && (url.startsWith("http://") || url.startsWith("https://"));
注意:`URLUtil`可能过于宽松(如接受`javascript:`),需额外检查协议。
3. URI类解析
利用`java.net.URI`解析并校验结构化格式:
java
try {
URI uri = new URI(url);
return uri.getScheme() != null && uri.getHost() != null;
} catch (URISyntaxException e) {
return false;
}
此方法严格验证URI语法,但可能拒绝部分合法URL(如含特殊字符需编码)。
4. 额外校验逻辑扩展
- 协议白名单:限制为`http`/`https`等安全协议。
- 域名有效性:通过DNS解析或正则校验顶级域(如`.com`)。
- 路径安全:检查是否包含`../`等非法路径跳转。
- 编码处理:对用户输入的URL进行编码(如空格转`%20`)。
5. 实际应用建议
- 结合正则与系统API提高覆盖率。
- 对输入进行预处理(如`trim()`去除首尾空格)。
- 在网络请求前再次验证,防止篡改。
示例完整代码:
java
public boolean validateUrl(String input) {
if (input == null) return false;
String url = input.trim();
// 基础格式检查
if (!URLUtil.isValidUrl(url) || !url.matches("^https?://.+$")) {
return false;
}
// 高级解析检查
try {
URI uri = new URI(url);
return uri.getHost() != null && uri.getScheme().matches("https?");
} catch (URISyntaxException e) {
return false;
}
}
注意:URL标准复杂(如国际化域名、非ASCII字符等),严格校验可能需要第三方库(如Apache Commons Validator)。