gpt4 book ai didi

c - 使用正则表达式编写可以验证 URL、IPv4 地址、IPv6 地址和 FQDN 的 C 函数

转载 作者:行者123 更新时间:2023-11-30 16:36:13 26 4
gpt4 key购买 nike

虽然下面的 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})

请注意,这将允许无效的 IP,例如 123.456.789.0。它只是检查每个数字是否为 1-3 位数字,而不是在 0255 之间。

关于c - 使用正则表达式编写可以验证 URL、IPv4 地址、IPv6 地址和 FQDN 的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com