Qt IP合法性校验

剑神 发布于 2013/07/11 14:09
阅读 2K+
收藏 0
Qt
在做网络连接相关的程序时,常常会用到IP校验。上网一搜,有很多正则表达式校验IP的方法,但是经过尝试之后发现,他们的那些方法并不能真正全部都校验正确。经过一段时间的尝试,我这里提供一种比较有效的方法,看上去自然是有些麻烦,这里我就直接贴出代码了:
static QString getString(QString s, int l)
{
    QString temp = s;
    QRegExp rx("[\u4e00-\u9fa5]");
    if (temp.replace(rx, "zz").length() <= l) {
        return s;
    }

    for (int i=s.length(); i>=0; i--) {
        temp = s.mid(0,i);
        if (temp.replace(rx, "zz").length() <= l) {
            return s.mid(0,i) + "";
        }
    }
    return QString("");
}

static QString getOneCharacter(QString s,int n){
    if(n<0||n>s.size())return QString("");
    else{
        QString tem1=getString(s,n+1);
        QString tem2=getString(s,n);
        QString rValue=tem1.replace(tem2,"");
        return rValue;
    }
}

上面两个方法是用来截取(中英文混合)字符串的单个字符的,而中英文混合也是IP校验中比较麻烦的一点,在Qt中,其实还有很多地方中英文混合字符串的处理都很让人头疼

static bool isNum(QString ch){
    QString num[]={"1","2","3","4","5","6","7","8","9","0"};
    for(int i=0;i<10;i++){
        if(ch.compare(num[i])==0)return true;
    }return false;
}

static bool isLegleValue(QString str){
    for(int i=0;i<str.size();i++){
        if(!isNum(getOneCharacter(str,i)))return false;
    }
    if(str.length()>3||str.length()<1)return false;
    if(str.toInt()<0||str.toInt()>255)return false;
    else return true;
}

static bool isIp(QString str){
    if(str.size()<7||str.size()>15)return false;
    else{
        int i=0;
        QString part="";
        for(int j=0;j<str.size();j++){
            QString tem=getOneCharacter(str,j);
            int x=0;x++;
            if(tem=="."){
                if(!isLegleValue(part))return false;
                i++;
                part="";
            }else if(j==str.size()-1){
                part+=tem;
                if(!isLegleValue(part))return false;
                else return true;
            }
            else{
                part+=tem;
            }
        }
        if(i==3)return true;
        else return false;
    }
}
isNum(QString ch)用来判断截取出来的一个字符是不是数字, isLegleValue(QString str)则是用来校验截取出来的用 '.' 分开字符串是不是符合IP地址要求(0~255之间的数),所以最后的isIp(QString str)就是直接对str进行IP校验是不是合法的。经过检验这个办法还是可行的。当然,不足之处,带请有心看客多多指正!


加载中
0
雾海树妖
雾海树妖

/^((([1-9]{0,1}|2[0-4]|1\d)\d|25[0-5])(\.|$)){4}/

还是习惯用正则来判断。。

剑神
剑神
你这个表达式是这么写吗:QString reg="^((([1-9]{0,1}|2[0-4]|1\d)\d|25[0-5])(\.|$)){4}"; ?
剑神
剑神
回复 @雾海树妖 : 恩好!
雾海树妖
雾海树妖
回复 @剑神 : 我匹配的就是标准的数字格式ip。。确切的说,除了符合ip定义的字符串,其他都视为非法ip。。你不信可以自己试。。更准确的说,除了[0-255].[0-255].[0-255].[0-255]之外的都不会通过
剑神
剑神
回复 @雾海树妖 : 而且还有一种可能是,虽然我输入的某个IP地址是中英文混合的,而恰巧却能够进行IP转换(就是被点分开的那些字符被动的转换成了int类型的数字)之后还能够使用.
剑神
剑神
@雾海树妖 对啊!但是有人在进行IP输入的时候非要输进去中文字符,比如说"I.P.地.址",你把这个字符串放到你的正则表达式里面去可能不会被检测到不合法.
下一页
返回顶部
顶部