2012-04-11 18 views
0

我需要解析作爲REST Web服務的一部分的「路由器」的URL的路徑部分。我正在使用PION庫來處理HTTP請求。這個庫似乎沒有任何功能來檢索URL路徑的一部分 - 或者看起來如此。我無法找到另一個這樣做的庫。例如,http://www.w3.org/Library/src/HTParse.c未給出部分路徑。如何解析使用C++的向量的路徑

是否有這樣做的更快,更可靠的方法:

std::vector<std::string> parsePath(std::string path) 
{ 
    std::string delimiter = "/"; 
    std::string part = ""; 
    std::size_t firstPos = 0; 
    std::size_t secondPos = 0; 
    std::vector<std::string> parts; 

    while (firstPos != std::string::npos) 
    { 
     firstPos = path.find(delimiter, firstPos); 
     secondPos = path.find(delimiter, firstPos + 1); 
     part = path.substr(firstPos + 1, (secondPos - 1) - firstPos); 
     if (part != "") parts.push_back(part); 
     firstPos = secondPos; 
    } 

    return parts; 
} 
+0

也許[this](http://stackoverflow.com/q/2616011/777186)有幫助。建議的方法不會像這樣返回「vector」,但如果需要轉換爲「vector」應該不困難。 – jogojapan 2012-04-11 03:01:48

+0

相關:http://stackoverflow.com/questions/2616011/easy-way-to-parse-a-url-in-c-cross-platform – HostileFork 2012-04-11 03:02:45

+0

是的,我看到了,但他們正在解析一個URL。所以他們想要推導出各種參數。我只想分開路徑,這樣我就可以分別讀取每一條路徑並推斷路線。 – 2012-04-11 04:15:03

回答

2

如果你必須使用Boost,最簡單的方法來分析文件系統路徑將是使用filesystem library,其優點自由被平臺無關和處理POSIX和Windows路徑變量:

boost::filesystem::path p1("/usr/local/bin"); 
boost::filesystem::path p2("c:\\"); 
std::cout << p1.filename() << std::endl; // prints "bin" 
std::cout << p1.parent_path() << std::endl; // prints "/usr/local" 

要通過的路徑中的每個元素進行迭代,你可以使用一個path iterator

for (auto const& element : p1) 
    std::cout << element << std::endl; 

打印

"/" 
"usr" 
"local" 
"bin" 

沒有升壓,選擇one of the many ways to parse a delimited string

+0

我看到了boost :: filesystem :: path。我將如何獲得路徑的每一部分? – 2012-04-11 04:08:49

+0

查看[此表](http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/reference.html#Path-decomposition-table)。我用一個例子更新了答案。 – mavam 2012-04-11 04:11:15

+0

所以它看起來像我可以使用的迭代器... – 2012-04-11 05:53:13