[C] 提取 URL 中的 domain

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_29757283/article/details/84871057

[C] 提取 URL 中的 domain

一个简单实现,仅供参考。

如果只是要提取 domain 来比较,并且放宽条件的话,可以直接使用 strstr(URL, domain) 即可。

从开源成熟的代码中拿出“提取 URL 中的 domain” 方案可能代码更健壮,但是因为本人经验有限,不清楚从哪里找到,所幸这个功能不是很复杂,我的场景要求也不高,所以简单自己实现了一份 solution。


如果有好的参考或建议等,欢迎在评论区指出。

Code

/**
 * filename: fetchDomain_in_URL.c
 * Author  : Joseph Lin
 * E-mail  : [email protected]
 */
#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$ 

猜你喜欢

转载自blog.csdn.net/qq_29757283/article/details/84871057