簡體   English   中英

使用可驗證URL,IPv4地址,IPv6地址和FQDN的正則表達式編寫C函數

[英]Writing a C function using regular expression that can validate URL, IPv4 address, IPv6 address and FQDN

盡管下面的C函數可以很好地驗證URL / FQDN的任何組合,但是它無法驗證IPv4地址以及IPv6和某些其他IPv6格式地址的簡寫形式。

可以立即使用以下正則表達式來驗證IPv4地址和IPv6地址嗎?

int validateURLPhase2(char *url)
{
    int    status;
    regex_t    re;

    char *regexp = "^((ftp|http|https)://)?([a-z0-9]([-a-z0-9]*[a-z0-9])?\\.)|([0-9].[0-9].[0-9].[0-9])|(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$";

    if ( regcomp(&re, regexp, REG_EXTENDED|REG_NOSUB|REG_ICASE) != 0 )
    {
        printf( "Regex has invalidated FQDN 1\n");
        return -1;
    }
    status = regexec(&re, url, (size_t) 0, NULL, 0);
    regfree(&re);
    if ( status != 0 )
    {
        printf("Regex has invalidated FQDN 2\n");
        return -1;
    }
    return 0;
}

理想情況下應接受但有效的有效URL格式: http:// [2001 :: 1] / abc正則表達式使FQDN 2驗證無效

無效的URL格式,理想情況下應被拒絕,但可以成功: http://10.192.1驗證成功

其他通過的案例: http : //10.2.1.1/abc http://www.example.com/abc

正則表達式中與數字地址匹配的部分在每個組件中僅允許一個數字。 它也無法逃脫. ,因此它可以匹配任何內容。 它應該是:

([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})

請注意,這將允許使用123.456.789.0類的無效IP。 它只是檢查每個數字是1-3位數字,而不是在0255之間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM