C语言URL解析器(代码分享)
By qianghaohao(Xqiang)
本程序可以解析出URL中每个字段的值然后存入结构体
中.也可以调用提供的API只获取需要的部分.
本URL解析器代码来自https://github.com/jwerle/url.h
在此基础上进行了大量的修改,修复了很多bug.总体思路
没有改变,就是把很多细节改了下,现在可以正常使用了.
-->可能还存在bug,如果网友发现了可以及时指正.
感受:花了一天多的时间修复,充分地感受到了IDE对编程
的效率的影响,一个很奇葩的越界导致的问题结果调了半天
没找到问题。。。结果人家五分钟搞定。。。
话不多说,直接上源代码:
接口文件:url_parser.h:
#ifndef URL_PARSER
#define URL_PARSER
/**
* Dependencies
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
/**
* url.h version
*/
#define URL_VERSION 0.0.2
/**
* Max length of a url protocol scheme
*/
#define URL_PROTOCOL_MAX_LENGTH 16
/**
* Max length of a url host part
*/
#define URL_HOSTNAME_MAX_LENGTH 128
/**
* Max length of a url tld part
*/
#define URL_TLD_MAX_LENGTH 16
/**
* Max length of a url auth part
*/
#define URL_AUTH_MAX_LENGTH 32
/**
* `url_data` struct that defines parts
* of a parsed URL such as host and protocol
*/
#define URL_MAX_LENGTH 1024
// url结构信息
typedef struct url_data {
char *href;
char *protocol;
char *host;
char *auth;
char *hostname;
char *pathname;
char *search;
char *path;
char *hash;
char *query;
char *port;
} url_data_t;
// prototype
/**
* Parses a url into parts and returns
* a `url_data_t *` pointer
*/
url_data_t *
url_parse (char *url);
char *
url_get_protocol (char *url);
char *
url_get_auth (char *url);
char *
url_get_hostname (char *url);
char *
url_get_host (char *url);
char *
url_get_pathname (char *url);
char *
url_get_path (char *url);
char *
url_get_search (char *url);
char *
url_get_query (char *url);
char *
url_get_hash (char *url);
char *
url_get_port (char *url);
void
url_free (url_data_t *data);
bool
url_is_protocol (char *str);
bool
url_is_ssh (char *str);
void
url_inspect (char *url);
void
url_data_inspect (url_data_t *data);
#endif
实现文件:url_parser.c:
使用用例:main.c:
/*************************************************************************
> File Name: main.c
> Author: qianghaohao(Xqiang)
> Program: url_parser
> Readme: 本URL解析器代码来自https://github.com/jwerle/url.h
> 在此基础上进行了大量的修改,修复了很多bug.
> 总体思路没有改变,就是把很多细节改了下,现在可以正常使用了.
> -->可能还存在bug,如果网友发现了可以及时指正.
> Platform: 可以跨平台使用
> Created Time: 2016年06月11日 星期六 18时39分14秒
************************************************************************/
#include"url_parser.h"
url_data_t *url_info = NULL;
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "usage:%s <url>", argv[0]);
return -1;
}
url_info = url_parse(argv[1]);
if (NULL == url_info) {
fprintf(stderr, "%s error...\n", argv[1]);
return -1;
}
url_data_inspect(url_info);
// 测试用例:http://www.baidu.com:80/cig-bin/index.html?sdkfj#283sjkdf
printf("\n================= API Demo ================\n");
printf("herf:%s\n", argv[1]);
char *hostname = url_get_host(argv[1]);
printf("hostname:%s\n", hostname);
char *path = url_get_path(argv[1]);
printf("path:%s\n", path);
char *host = url_get_host(argv[1]);
printf("host:%s\n", host);
char *proto = url_get_protocol(argv[1]);
printf("protocol:%s\n", proto);
char *auth = url_get_auth(argv[1]);
printf("auth:%s\n", auth);
char *search = url_get_search(argv[1]);
printf("search:%s\n", search);
char *hash = url_get_hash(argv[1]);
printf("hash:%s\n", hash);
char *query = url_get_query(argv[1]);
printf("query:%s\n", query);
char *port = url_get_port(argv[1]);
printf("port:%s\n", port);
return 0;
}
运行结果: