关于editview的url验证
在一次开发中,我遇到了这样的一个需求,要求输入框的内容只能识别url,要求如下:
纯ip:例如:172.16.15.45
IP+端口:172.16.15.45:3306
协议+ip域名+端口:http/https://172.16.45:3306
域名:www.baidu.com
协议+域名:http/https://www.baidu.com
首先第一步:editview的代码部分:
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/server"
style="@style/LoginEditText"
android:digits="0123456789abcdefghijklmnopqrstuvwxyz.:/@"
android:hint="@string/server_label"
android:inputType="textUri"
android:nextFocusDown="@id/username"
app:layout_constraintBottom_toTopOf="@+id/gateway_list"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/qrScan"
app:layout_constraintTop_toBottomOf="@+id/upload_tips" />
android:digits="0123456789abcdefghijklmnopqrstuvwxyz.:/@"这一句限制我们输入的字符
安卓逻辑部分:
//url输入的框限制输入特殊字符以及表情包
viewBinding.server.setFilters(new InputFilter[]{new InputFilterSpecial()});
//限制输入的字符最大长度
viewBinding.server.setFilters(new InputFilter[]{new InputFilter.LengthFilter(30)});
输入的url进行处理验证:
public static String verifyUpload(String server){
String prefix="";
String ipOrDomain= "";
String suffix="";
String[] arr=dealServer(server);
//url为空提醒
if (TextUtils.isEmpty(server)){
return UIUtils.getString(R.string.server_empty);
}
//前缀,ip,端口号都存在的情况 for example: https://172.16.15.45 or domain
if (arr.length==3){
prefix=arr[0];
ipOrDomain=arr[1];
suffix= arr[2];
if (isLegalIpOrDomain(ipOrDomain)&&isLegalPort(suffix)){
return null;
}else {
return UIUtils.getString(R.string.server_error);
}
//存在两种的情况
}else if (arr.length==2){
//前缀和ip for example: http://172.16.15.45 or domain
if (isLegalPrefix(server)){
prefix=arr[0];
ipOrDomain=arr[1];
if (isLegalIpOrDomain(ipOrDomain)){
return null;
}else {
return UIUtils.getString(R.string.server_error);
}
//ip和端口号 for example: 172.16.15.45 or domain:8080
}else {
ipOrDomain=arr[0];
suffix=arr[1];
if (isLegalIpOrDomain(ipOrDomain)&&isLegalPort(suffix)){
return null;
}else {
return UIUtils.getString(R.string.server_error);
}
}
//只存在ip地址的情况 for example: 172.16.15.45 or www.baidu.com
}else{
ipOrDomain=arr[0];
if (isLegalIpOrDomain(ipOrDomain)){
return null;
}else {
return UIUtils.getString(R.string.server_error);
}
}
}
url验证工具类
public class UrlVerifyUtils {
//url处理
public static String[] dealServer(String server){
String arr[] = new String[3];
server=server.replace("/","");
arr=server.split(":");
return arr;
}
//前缀验证
public static Boolean isLegalPrefix(String server) {
if (!server.startsWith("http://") && !server.startsWith("https://")) {
return false;
}else {
return true;
}
}
//ip地址验证
public static Boolean isLegalIpOrDomain(String ipOrDomain){
//验证ip的合法性
final String ipRegex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
//验证域名的合法性
final String domainRegex= "^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$";
if(Pattern.matches(ipRegex,ipOrDomain)||Pattern.matches(domainRegex,ipOrDomain)){
return true;
}else {
return false;
}
}
//端口号
public static Boolean isLegalPort(String suffix){
if (isNumberString(suffix)){
if (Integer.parseInt(suffix)>0&&Integer.parseInt(suffix)<=65535){
return true;
}else {
return false;
}
}else {
return false;
}
}
//正则表达式判断是否是数字字符串(可判断正数,负数和小数)
public static boolean isNumberString(String str) {
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("-?[0-9]+(\\.[0-9]+)?");
return pattern.matcher(str).matches();
}