天天看點

【C++】擷取url參數

擷取url參數

代碼示例

/**
 * C++ 擷取url參數, a=1&b=2&c=3
 *
 * @param url_args
 * @param url_params
 * @return
 */
int get_url_args(map<string, string> &url_args, string &url_params) {
    if (url_params.empty()) {
        return -1;
    }

    string key;
    string val;

    size_t last_pos = 0;
    size_t amp_pos = 0;  /* & == amp;*/
    size_t equal_pos = 0;

    while ((equal_pos = url_params.find('=', last_pos)) != string::npos) {
        amp_pos = url_params.find('&', last_pos);
        if (amp_pos == string::npos) {
            amp_pos = url_params.length();
        }

        key = url_params.substr(last_pos, equal_pos - last_pos);
        val = url_params.substr(equal_pos + 1, amp_pos - (equal_pos + 1));

        url_args[key] = val;

        last_pos = amp_pos + 1;

        if (last_pos >= url_params.length()) {
            break;
        }
    }
    return 0;
}      

測試

int main() {
    map<string, string> url_args;
    string url_params = "cdncode=18907E7BE0798990%2F&index=2&xxxxx=18840&yyyyy=30000&brs=760272&bre=1190603&ver=4&stdfrom=5000";
    get_url_args(url_args, url_params);
    //map<string, string>::iterator it = url_args.begin();
    auto it = url_args.begin();
    for (; it != url_args.end(); it++) {
        cout << it->first << "=" << it->second << endl;
    }

    return 0;
}      

運作結果

bre=1190603
brs=760272
cdncode=18907E7BE0798990%2F
index=2
stdfrom=5000
ver=4
xxxxx=18840
yyyyy=30000      

擷取域名

/**
 * C++ 擷取域名
 *
 * @param url
 * @param domain
 * @param is_http
 * @return
 */
int get_domain(const string &url, string &domain, bool is_http) {
    if (url.empty()) {
        return -1;
    }

    domain = "";

    const string http = "http://";
    const string https = "https://";

    if (url.find(http) != string::npos || url.find(https) != string::npos) {
        string::size_type start_pos = is_http ? http.length() : https.length();
        string::size_type end_pos = url.find("/", start_pos);
        if (end_pos != string::npos) {
            domain = url.substr(start_pos, end_pos - start_pos);
        } else {
            domain = url.substr(start_pos);
        }

    }

    return 0;

}      

測試

int main() {
    string http_domain;
    get_domain("http://aaa.bbb.com/1.mp4", http_domain, true);
    cout << http_domain << endl;

    string https_domain;
    get_domain("https://111.222.333", https_domain, false);
    cout << https_domain << endl;
    return 0;
}      

運作結果

aaa.bbb.com
111.222.333