2012-04-11 6 views
0

"ルータ"のURLのパス部分をREST Webサービスの一部として解析する必要があります。私はHTTP要求を処理するためにPIONライブラリを使用しています。このライブラリは、URLパスの一部を取得するための機能を持っていないようです。私はこれを行う別のライブラリを見つけることができません。 http://www.w3.org/Library/src/HTParse.cは、パスの一部を示しません。howtoは、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)が役に立ちます。この方法では、「ベクトル」は返されませんが、必要に応じて「ベクトル」に変換するのは困難ではありません。 – jogojapan

+0

関連:http://stackoverflow.com/questions/2616011/easy-way-to-parse-a-url-in-c-cross-platform – HostileFork

+0

ええ、私はそれを見ましたが、彼らはURLを解析しています。だから彼らはあらゆる種類のパラメータを推定したいと思っています。私はパスを分割したいので、それぞれ別々に読み込み、ルートを推論することができます。 –

答えて

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を使用することができます210枚の

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を見ました。パスの各部分をどのように取得するのですか? –

+0

[この表](http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/reference.html#Path-decomposition-table)をご覧ください。答えを例で更新しました。 – mavam

+0

だから、私が使うことができるイテレータがあるようです... –

関連する問題