Собственно, вопрос, я думаю, ясен. Есть ли какая-нибудь библиотека, чтобы можно было проверить правильность URI и распрасить его затем на части?
Что-то типа Uri класса в .NET, но под С/C++.
Я пользовал boost::regex_match — подробности в коде:
typedef const char* CSTR;
typedef std::string STRING;
#define RE_URL_FOR_PARSE "^(([a-z0-9]+)
![](/Forum/Images/frown.gif)
\\/\\/)?)?"\
"(([a-z0-9_\\.%\\+\\-]+)(
![](/Forum/Images/frown.gif)
.*?)?)?@)?" /*username/password*/\
"([a-z0-9_%\\+\\.\\-]+)?(
![](/Forum/Images/frown.gif)
[0-9]+))?" /*host/port*/\
"((\\/)?(.*?))?" /*path*/\
"(\\?(.*?))?" /*query*/\
"(#(.*?))?$" /*anchor*/
//////////////////////////////////////////////////////////////////////////
struct SaUrlInfo {
STRING sProtocol;
STRING sProtocolPost;
STRING sHost;
STRING sPort;
STRING sUserName;
STRING sPassword;
STRING sPath;
STRING sQuery;
STRING sAnchor;
};
//////////////////////////////////////////////////////////////////////////
SaUrlInfo CaWebUtils::parseUrl (CSTR url) {
using namespace boost;
SaUrlInfo res;
if (url == NULL)
return res;
STRING sUrl(url);
regex reUrl (RE_URL_FOR_PARSE, regex_constants::normal | regex_constants::icase );
smatch matches;
if( !regex_match(sUrl, matches, reUrl )) {
STRING sError("Invalid URL parts: " + sUrl);
CaLogger::error(sError.c_str ());
return res;
}
res.sProtocol = (matches[2].matched ? matches.str(2) : "");
res.sProtocolPost = (matches[3].matched ? matches.str(3) : "");
res.sUserName = (matches[5].matched ? matches.str(5) : "");
res.sPassword = (matches[7].matched ? matches.str(7) : "");
res.sHost = (matches[8].matched ? matches.str(8) : "");
res.sPort = (matches[10].matched ? matches.str(10) : "");
res.sPath = (matches[11].matched ? matches.str(11) : "");
// fix path for URL like "
http://host?p=1"
if (res.sPath[0] != '/')
res.sPath.insert(0, "/");
res.sQuery = (matches[15].matched ? matches.str(15) : "");
res.sAnchor = (matches[17].matched ? matches.str(17) : "");
return res;
}
Здравствуйте, Аноним, Вы писали:
А>Собственно, вопрос, я думаю, ясен. Есть ли какая-нибудь библиотека, чтобы можно было проверить правильность URI и распрасить его затем на части?
А>Что-то типа Uri класса в .NET, но под С/C++.
AfxParseURL
InternetCrackUrl