[C] 提取 URL 中的 domain
一个简单实现,仅供参考。
如果只是要提取 domain 来比较,并且放宽条件的话,可以直接使用 strstr(URL, domain)
即可。
从开源成熟的代码中拿出“提取 URL 中的 domain” 方案可能代码更健壮,但是因为本人经验有限,不清楚从哪里找到,所幸这个功能不是很复杂,我的场景要求也不高,所以简单自己实现了一份 solution。
如果有好的参考或建议等,欢迎在评论区指出。
Overview
Code
/**
* filename: fetchDomain_in_URL.c
* Author : Joseph Lin
* E-mail : joseph.lin@aliyun.com
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void your_API_to_get_URL_from(char *_src, char *_dst){
sprintf(_dst, "%s", _src);
}
int main(int argc, char *argv[])
{
if (argc != 2){
printf("usage: %s <URL>\n", argv[0]);
exit(1);
}
#if 1 // Joseph, fetch domain name from URL
char _buf[256] = {'\0'};
char _transfer[256] = {'\0'};
your_API_to_get_URL_from(argv[1], (void*)_buf);
#define _transfer_var_and_memset(_dst, _src, _len, _size_t) do {\
memset(_dst, '\0', _len*_size_t);\
snprintf(_dst, _len*_size_t, "%s", _src);\
memset(_src, '\0', _len*_size_t);\
} while(0)
// 0123456
if (strstr(_buf, "http://")){
snprintf(_transfer, 256*sizeof(char), "%s", &_buf[7]);
_transfer_var_and_memset(_buf, _transfer, 256, sizeof(char));
}else if (strstr(_buf, "https://")){
snprintf(_transfer, 256*sizeof(char), "%s", &_buf[8]);
_transfer_var_and_memset(_buf, _transfer, 256, sizeof(char));
}
#define _remove_suffix_by(_symbol, __buf, __transfer, _len, _size_t) do{ \
int _idx = 0;\
for (_idx=0; __buf[_idx]!=_symbol; _idx++){\
__transfer[_idx] = __buf[_idx];\
}\
_transfer_var_and_memset(__buf, __transfer, _len, _size_t);\
} while(0)
if (strstr(_buf, ":")){ // remove port
_remove_suffix_by(':', _buf, _transfer, 256, sizeof(char));
}
else if(strstr(_buf, "/")){ // no port, but with "dir" path
_remove_suffix_by('/', _buf, _transfer, 256, sizeof(char));
}
#endif
printf("%s\n", _buf);
return 0;
}
Note
上面的代码对错误格式的 URL 会提取错误的 domain,不过,错误的 URL 本来配置进去也会是使用不了的(链接不上的意思),没啥意义。
需要适合自己的提取 domain 的代码,在上面的代码基础上简单改改就可以。相信你会改的。
#if 1 ... #endif
是从 URL 提取 domain 的主要代码。
Test
joseph@LINUX:tmp$ gcc fetchDomain_in_URL.c
joseph@LINUX:tmp$ ./a.out "youku.com"
youku.com
joseph@LINUX:tmp$ ./a.out "www.baidu.com"
www.baidu.com
joseph@LINUX:tmp$ ./a.out "www.jos.hea.or.com:8301"
www.jos.hea.or.com
joseph@LINUX:tmp$
joseph@LINUX:tmp$ ./a.out "www.jos.hea.or.com:8301/dir1/dir2/"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "www.jos.hea.or.com:8301/dir1/dir2"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "http://www.jos.hea.or.com:8301"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "https://www.jos.hea.or.com:8301"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "http://www.jos.hea.or.com:8238/dir1/dir2"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "https://www.jos.hea.or.com:8238/dir1/dir2"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "http://www.jos.hea.or.com/dir1/dir2/"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "http://www.jos.hea.or.com/dir1/dir2"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "https://www.jos.hea.or.com/dir1/dir2/"
www.jos.hea.or.com
joseph@LINUX:tmp$ ./a.out "https://www.jos.hea.or.com/dir1/dir2"
www.jos.hea.or.com
joseph@LINUX:tmp$
joseph@LINUX:tmp$ #### wrong fomart
joseph@LINUX:tmp$ ./a.out "http:/www.fduo2.dio2.com"
http
joseph@LINUX:tmp$