2010-02-18 121 views

回答

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; 
} 
1

简短的回答,不是真的。

您将不得不解析字符串并替换尾部。例如,使用boost :: regex会很容易。

+0

并不那么简单。有关如何解析相对URI的完整算法,请参阅RFC 2396第5.2节。 – 2010-02-18 00:40:48

+1

RFC 2396是一个阅读的婊子。 – CarbonAsh 2010-02-18 01:02:06