C++によるURL文字列解析
Javaの場合、java.net.URLを使うと、URL文字列からホスト名やパス名を抽出することが出来る。C++の場合、どうやれば良いんだろうといろいろ探した結果、uriparserを使えばいけることが分かった。
調べた感じではcpp-netlibでも行けそうな感じだったけど、こちらはBoostなどが必要になりそう?
サンプルコード
注意する点は、サンプルでは特にエラーチェックなどは行っていないことと、URL文字列はフルのものを使用しているということ。uriparserの場合、存在しない項目に対してアクセスすると、セグメンテーション違反で落ちます。
#include <cstdio> #include <uriparser/Uri.h> int main(int argc, char **argv) { UriParserStateA state; UriUriA uri; state.uri = &uri; // None error check const char* u = "http://user:pass@example.com:8080/hoge/index.html?hoge=foo#bar"; uriParseUriA(&state, u); printf("host : %s\n", uri.scheme.first); printf("host : %s\n", uri.scheme.afterLast); printf("\n"); printf("host : %s\n", uri.userInfo.first); printf("host : %s\n", uri.userInfo.afterLast); printf("\n"); printf("host : %s\n", uri.hostText.first); printf("host : %s\n", uri.hostText.afterLast); printf("\n"); printf("port : %s\n", uri.portText.first); printf("port : %s\n", uri.portText.afterLast); printf("\n"); printf("path : %s\n", uri.pathHead->text.first); printf("path : %s\n", uri.pathHead->text.afterLast); printf("\n"); printf("query: %s\n", uri.query.first); printf("query: %s\n", uri.query.afterLast); printf("\n"); printf("frag : %s\n", uri.fragment.first); printf("frag : %s\n", uri.fragment.afterLast); uriFreeUriMembersA(&uri); return 0; }
実行結果
実行してみると、以下のように抽出したい情報そのものはとれずに、どうやら自分で文字列を抜き出さないといけないっぽい。ただ、これだと面倒だし、何かしら方法はありそうな気もするけど(未確認)。
scheme: http://user:pass@example.com:8080/hoge/index.html?hoge=foo#bar scheme: ://user:pass@example.com:8080/hoge/index.html?hoge=foo#bar userInfo : user:pass@example.com:8080/hoge/index.html?hoge=foo#bar userInfo : @example.com:8080/hoge/index.html?hoge=foo#bar host : example.com:8080/hoge/index.html?hoge=foo#bar host : :8080/hoge/index.html?hoge=foo#bar port : 8080/hoge/index.html?hoge=foo#bar port : /hoge/index.html?hoge=foo#bar path : hoge/index.html?hoge=foo#bar path : /index.html?hoge=foo#bar query: hoge=foo#bar query: #bar frag : bar frag :