Я разработал «объектно-ориентированное» решение, один класс C ++, который работает с одним регулярным выражением, таким как решения @ Mr.Jones и @velcrow. Мой класс Url
выполняет разбор URL / uri.
Я думаю, что улучшил Velcrow регулярное выражение, чтобы быть более устойчивым и включает также часть имени пользователя.
Следуя первой версии моей идеи, я выпустил тот же код, улучшенный, в моем GPL3 лицензированном проекте с открытым исходным кодом Cpp URL Parser .
Пропущено #ifdef/ndef
раздутая часть, следует Url.h
#include <string>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
class Url {
public:
boost::regex ex;
string rawUrl;
string username;
string protocol;
string domain;
string port;
string path;
string query;
string fragment;
Url();
Url(string &rawUrl);
Url &update(string &rawUrl);
};
Это код файла реализации Url.cpp
:
#include "Url.h"
Url::Url() {
this -> ex = boost::regex("(ssh|sftp|ftp|smb|http|https):\\/\\/(?:([^@ ]*)@)?([^:?# ]+)(?::(\\d+))?([^?# ]*)(?:\\?([^# ]*))?(?:#([^ ]*))?");
}
Url::Url(string &rawUrl) : Url() {
this->rawUrl = rawUrl;
this->update(this->rawUrl);
}
Url &Url::update(string &rawUrl) {
this->rawUrl = rawUrl;
boost::cmatch what;
if (regex_match(rawUrl.c_str(), what, ex)) {
this -> protocol = string(what[1].first, what[1].second);
this -> username = string(what[2].first, what[2].second);
this -> domain = string(what[3].first, what[3].second);
this -> port = string(what[4].first, what[4].second);
this -> path = string(what[5].first, what[5].second);
this -> query = string(what[6].first, what[6].second);
this -> fragment = string(what[7].first, what[7].second);
}
return *this;
}
Пример использования:
string urlString = "http://gino@ciao.it:67/ciao?roba=ciao#34";
Url *url = new Url(urlString);
std::cout << " username: " << url->username << " URL domain: " << url->domain;
std::cout << " port: " << url->port << " protocol: " << url->protocol;
Вы также можете обновить объект Url, чтобы представлять (и анализировать) другой URL:
url.update("http://gino@nuovociao.it:68/nuovociao?roba=ciaoooo#")
Я только сейчас изучаю C ++, так что я не уверен, что следовал 100% рекомендациям C ++.
Любой совет приветствуется.
P.s: давайте посмотрим на Cpp URL Parser , там есть уточнения.
Веселись