欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]uriScheme类实现的简单版本[URI资料解析类]。

[原创]uriScheme类实现的简单版本[URI资料解析类]。

上午发了一篇文章讲解解析URL小技巧,但aqtata大侠发了一个标准文档出来,于是根据标准文档编写代码,花了几个小时,写了一个简单版本的uri Scheme,接下来请看代码。
原文地址:http://bbs.pediy.com/showthread.php?t=179681
PS:只负责解析标准的HTTPS、HTTP链接,其他的链接如果崩溃了一律不负责。

void testScheme() {

	Scheme::uriScheme* uri = new Scheme::uriScheme("foo://example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose");

	printf("%s\r\n", uri->getSchemeName());

	printf("%s\r\n", uri->getHostName());

	printf("%s\r\n", uri->getHostPort());

	printf("%s\r\n", uri->getInfoPath());

	printf("%s\r\n", uri->getQueueInfo());

	printf("%s\r\n", uri->getFragment());

	delete uri;

补充一下:

以上依次输出:foo、example.com、8042(如果没有端口默认80、443,这是标准的端口)、/over/there/index.dtb、type=animal&name=narwhal、nose

}

uriScheme.h
/*

 * uriScheme.h

 *

 *  Created on: Oct 5, 2013

 *      Author: vscen

 */

#ifndef URISCHEME_H_

#define URISCHEME_H_

#include "xxxxxxxx.h"

namespace Scheme {

class uriScheme {

	char* uri_;

	size_t urilen_;

public:

	explicit uriScheme(const char* uri);

	virtual ~uriScheme();

	const char* getSchemeName();

	const char* getHostName();

	const char* getHostPort();

	const char* getInfoPath();

	const char* getQueueInfo();

	const char* getFragment();

private:

	bool createsUriScheme(const char* uri);

	void destroyUriScheme();

	bool isEmptyUriScheme() const;

	size_t getUriLength() const;

	const char* getUriString() const;

	bool parsedSchemeName();

	bool parsedHostName();

	bool parsedHostPort();

	bool parsedInfoPath();

	bool parsedQueueInfo();

	bool parsedFragment();

};

}

uriScheme.cc
/*

 * uriScheme.cc

 *

 *  Created on: Oct 5, 2013

 *      Author: vscen

 */

#include "uriScheme.h"

namespace Scheme {

namespace uriSchemeConst {

char* kPos = NULL;

const unsigned long kMaxUriScheme = 1024;

char kSchemeName[kMaxUriScheme] = { 0 };

char kHostName[kMaxUriScheme] = { 0 };

char kHostPort[kMaxUriScheme] = { 0 };

char kInfoPath[kMaxUriScheme] = { 0 };

char kQueueInfo[kMaxUriScheme] = { 0 };

char kFragment[kMaxUriScheme] = { 0 };

}

uriScheme::uriScheme(const char* uri) {

	if (uriScheme::createsUriScheme(uri)) {

		uriScheme::parsedSchemeName();

		uriScheme::parsedHostName();

		uriScheme::parsedHostPort();

		uriScheme::parsedInfoPath();

		uriScheme::parsedQueueInfo();

		uriScheme::parsedFragment();

	}

}

uriScheme::~uriScheme() {

	uriScheme::destroyUriScheme();

}

const char* uriScheme::getSchemeName() {

	return (uriSchemeConst::kSchemeName);

}

const char* uriScheme::getHostName() {

	return (uriSchemeConst::kHostName);

}

const char* uriScheme::getHostPort() {

	return (uriSchemeConst::kHostPort);

}

const char* uriScheme::getInfoPath() {

	return (uriSchemeConst::kInfoPath);

}

const char* uriScheme::getQueueInfo() {

	return (uriSchemeConst::kQueueInfo);

}

const char* uriScheme::getFragment() {

	return (uriSchemeConst::kFragment);

}

bool uriScheme::createsUriScheme(const char* uri) {

	uriScheme::urilen_ = strlen(uri);

	uriScheme::uri_ = (char*) malloc(uriScheme::getUriLength() + 1);

	if (!uriScheme::isEmptyUriScheme()) {

		return false;

	} else {

		memcpy(uriScheme::uri_, uri, uriScheme::getUriLength());

		uriScheme::uri_[uriScheme::getUriLength()] = 0;

		uriSchemeConst::kPos = uriScheme::uri_;

		return (uriScheme::getUriLength() < uriSchemeConst::kMaxUriScheme);

	}

}

void uriScheme::destroyUriScheme() {

	if (uriScheme::isEmptyUriScheme()) {

		free(uriScheme::uri_);

		uriScheme::urilen_ = 0;

		uriSchemeConst::kPos = NULL;

	}

}

bool uriScheme::isEmptyUriScheme() const {

	return (uriScheme::getUriString() != NULL && uriScheme::getUriLength() > 0);

}

size_t uriScheme::getUriLength() const {

	return (uriScheme::urilen_);

}

const char* uriScheme::getUriString() const {

	return (uriScheme::uri_);

}

bool uriScheme::parsedSchemeName() {

	char* buf = uriSchemeConst::kPos;

	if (buf == NULL) {

		return false;

	} else {

		int i = 0;

		for (i = 0; *buf != 0; buf++, i++) {

			uriSchemeConst::kSchemeName[i] = *buf;

			if (isalpha(*buf)) {

				continue;

			} else if (isdigit(*buf)) {

				continue;

			} else if (*buf == '+' || *buf == '.' || *buf == '-') {

				continue;

			} else if (*buf == ':') {

				break;

			} else {

				return false;

			}

		}

		uriSchemeConst::kSchemeName[i] = 0;

		uriSchemeConst::kPos = buf;

		return true;

	}

}

bool uriScheme::parsedHostName() {

	char* buf = uriSchemeConst::kPos;

	if (buf == NULL || strncmp(buf, "://", 3) != 0) {

		return false;

	} else {

		buf += 3;

		int i = 0;

		for (i = 0; *buf != 0; buf++, i++) {

			uriSchemeConst::kHostName[i] = *buf;

			if (*buf == ':' || *buf == '/') {

				break;

			}

		}

		uriSchemeConst::kHostName[i] = 0;

		uriSchemeConst::kPos = buf;

		return true;

	}

}

bool uriScheme::parsedHostPort() {

	char* buf = uriSchemeConst::kPos;

	if (buf == NULL || *buf != ':') {

		if (strncasecmp(uriSchemeConst::kSchemeName, "http", 4) == 0) {

			strncat(uriSchemeConst::kHostPort, "80\0", 3);

			return true;

		} else if (strncasecmp(uriSchemeConst::kSchemeName, "https", 5) == 0) {

			strncat(uriSchemeConst::kHostPort, "443\0", 4);

			return true;

		} else {

			return false;

		}

	} else {

		buf += 1;

		int i = 0;

		for (i = 0; *buf != 0; buf++, i++) {

			uriSchemeConst::kHostPort[i] = *buf;

			if (*buf == '/') {

				break;

			}

		}

		uriSchemeConst::kHostPort[i] = 0;

		uriSchemeConst::kPos = buf;

		return true;

	}

}

bool uriScheme::parsedInfoPath() {

	char* buf = uriSchemeConst::kPos;

	if (buf == NULL || *buf != '/') {

		return false;

	} else {

		int i = 0;

		for (i = 0; *buf != 0; buf++, i++) {

			uriSchemeConst::kInfoPath[i] = *buf;

			if ((*buf == '/') && (*(buf + 1) == 0)) {

				break;

			} else if (*buf == '?') {

				break;

			} else {

				continue;

			}

		}

		uriSchemeConst::kInfoPath[i] = 0;

		uriSchemeConst::kPos = buf;

		return true;

	}

}

bool uriScheme::parsedQueueInfo() {

	char* buf = uriSchemeConst::kPos;

	if (buf == NULL || *buf != '?') {

		return false;

	} else {

		buf += 1;

		int i = 0;

		for (i = 0; *buf != 0; buf++, i++) {

			uriSchemeConst::kQueueInfo[i] = *buf;

			if (*buf == '#') {

				break;

			} else {

				continue;

			}

		}

		uriSchemeConst::kQueueInfo[i] = 0;

		uriSchemeConst::kPos = buf;

		return true;

	}

}

bool uriScheme::parsedFragment() {

	char* buf = uriSchemeConst::kPos;

	if (buf == NULL || *buf != '#') {

		return false;

	} else {

		buf += 1;

		int i = 0;

		for (i = 0; *buf != 0; buf++, i++) {

			uriSchemeConst::kFragment[i] = *buf;

			continue;

		}

		uriSchemeConst::kFragment[i] = 0;

		uriSchemeConst::kPos = buf;

		return true;

	}

}

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功