C ++ urljoin等价

时间:2010-02-18 00:10:43

标签: c++ url

Python有一个函数urljoin,它接受两个URL并智能地连接它们。是否有一个在c ++中提供类似功能的库?

urljoin文档:http://docs.python.org/library/urlparse.html

和python示例:

>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'

3 个答案:

答案 0 :(得分:1)

简短回答,不是真的。

您必须解析字符串并替换尾部。这可以很容易地使用,例如,boost :: regex。

答案 1 :(得分:1)

我明白了。我使用了库uriparser:http://uriparser.sourceforge.net/并匆匆实现了如下功能。它执行稀疏错误检查并可能泄漏内存。

std::string urljoin(std::string &base, std::string &relative)
{
    UriParserStateA state;
    UriUriA uriOne;
    UriUriA uriTwo;

    state.uri = &uriOne;

    if (uriParseUriA(&state, base.c_str()) != URI_SUCCESS)
    {
        return "";
    }
    state.uri = &uriTwo;
    if (uriParseUriA(&state, relative.c_str()) != URI_SUCCESS)
    {
        uriFreeUriMembersA(&uriTwo);
        return "";
    }

    UriUriA result;
    if (uriAddBaseUriA(&result, &uriTwo, &uriOne) != URI_SUCCESS)
    {
        uriFreeUriMembersA(&result);
        return "";
    }
    uriFreeUriMembersA(&uriOne);
    uriFreeUriMembersA(&uriTwo);

    int charsRequired;
    uriToStringCharsRequiredA(&result, &charsRequired);
    charsRequired++;

    char *buf = (char*) malloc(charsRequired * sizeof(char)); if (uriToStringA(buf, &result, charsRequired, NULL) != URI_SUCCESS)
        return "";
    uriFreeUriMembersA(&result);

    std::string ret(buf);
    free(buf);

    return ret;
}

答案 2 :(得分:1)

Poco::URI中的POCO C++ Libraries类可以执行此操作(请参阅resolve()成员函数)。