Easy way to parse a url in C++ cross platform?












61















I need to parse a URL to get the protocol, host, path, and query in an application I am writing in C++. The application is intended to be cross-platform. I'm surprised I can't find anything that does this in the boost or POCO libraries. Is it somewhere obvious I'm not looking? Any suggestions on appropriate open source libs? Or is this something I just have to do my self? It's not super complicated but it seems like such a common task I am surprised there isn't a common solution.










share|improve this question




















  • 1





    C++ (and even more so C) isn't like some other languages. It's not the sort of thing where standard libraries just exist by default for everything under the sun. There might be some library in common usage, but from the perspective of standard libraries, language features, even OS-specific APIs like POSIX, it's assumed that you can do a lot yourself.

    – asveikau
    Apr 11 '10 at 4:09






  • 25





    Im happy to build a wheel but dont see the point in building it if someone else has done it. Hence my question. Youre right, "There might be some library in common usage" - thats what I was asking.

    – Andrew Bucknell
    Apr 11 '10 at 6:52






  • 1





    It's the sort of small utility you'd find in the big framework you codebase relies on. If it isn't there then it's a fun exercise in standard algorithms to write a small URL utility collection.

    – wilhelmtell
    Apr 11 '10 at 7:02











  • curl.haxx.se/libcurl/c/curl_unescape.html

    – hB0
    Oct 28 '13 at 14:15











  • To parse URLs using the RFC 3986 standard, simply and without importing any new libraries, check out this answer to a related question: stackoverflow.com/a/31613265/1043704

    – Lorien Brune
    Sep 30 '17 at 1:42
















61















I need to parse a URL to get the protocol, host, path, and query in an application I am writing in C++. The application is intended to be cross-platform. I'm surprised I can't find anything that does this in the boost or POCO libraries. Is it somewhere obvious I'm not looking? Any suggestions on appropriate open source libs? Or is this something I just have to do my self? It's not super complicated but it seems like such a common task I am surprised there isn't a common solution.










share|improve this question




















  • 1





    C++ (and even more so C) isn't like some other languages. It's not the sort of thing where standard libraries just exist by default for everything under the sun. There might be some library in common usage, but from the perspective of standard libraries, language features, even OS-specific APIs like POSIX, it's assumed that you can do a lot yourself.

    – asveikau
    Apr 11 '10 at 4:09






  • 25





    Im happy to build a wheel but dont see the point in building it if someone else has done it. Hence my question. Youre right, "There might be some library in common usage" - thats what I was asking.

    – Andrew Bucknell
    Apr 11 '10 at 6:52






  • 1





    It's the sort of small utility you'd find in the big framework you codebase relies on. If it isn't there then it's a fun exercise in standard algorithms to write a small URL utility collection.

    – wilhelmtell
    Apr 11 '10 at 7:02











  • curl.haxx.se/libcurl/c/curl_unescape.html

    – hB0
    Oct 28 '13 at 14:15











  • To parse URLs using the RFC 3986 standard, simply and without importing any new libraries, check out this answer to a related question: stackoverflow.com/a/31613265/1043704

    – Lorien Brune
    Sep 30 '17 at 1:42














61












61








61


19






I need to parse a URL to get the protocol, host, path, and query in an application I am writing in C++. The application is intended to be cross-platform. I'm surprised I can't find anything that does this in the boost or POCO libraries. Is it somewhere obvious I'm not looking? Any suggestions on appropriate open source libs? Or is this something I just have to do my self? It's not super complicated but it seems like such a common task I am surprised there isn't a common solution.










share|improve this question
















I need to parse a URL to get the protocol, host, path, and query in an application I am writing in C++. The application is intended to be cross-platform. I'm surprised I can't find anything that does this in the boost or POCO libraries. Is it somewhere obvious I'm not looking? Any suggestions on appropriate open source libs? Or is this something I just have to do my self? It's not super complicated but it seems like such a common task I am surprised there isn't a common solution.







c++ url uri






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jul 13 '12 at 19:06









Elliot Cameron

3,96122127




3,96122127










asked Apr 11 '10 at 4:03









Andrew BucknellAndrew Bucknell

7633927




7633927








  • 1





    C++ (and even more so C) isn't like some other languages. It's not the sort of thing where standard libraries just exist by default for everything under the sun. There might be some library in common usage, but from the perspective of standard libraries, language features, even OS-specific APIs like POSIX, it's assumed that you can do a lot yourself.

    – asveikau
    Apr 11 '10 at 4:09






  • 25





    Im happy to build a wheel but dont see the point in building it if someone else has done it. Hence my question. Youre right, "There might be some library in common usage" - thats what I was asking.

    – Andrew Bucknell
    Apr 11 '10 at 6:52






  • 1





    It's the sort of small utility you'd find in the big framework you codebase relies on. If it isn't there then it's a fun exercise in standard algorithms to write a small URL utility collection.

    – wilhelmtell
    Apr 11 '10 at 7:02











  • curl.haxx.se/libcurl/c/curl_unescape.html

    – hB0
    Oct 28 '13 at 14:15











  • To parse URLs using the RFC 3986 standard, simply and without importing any new libraries, check out this answer to a related question: stackoverflow.com/a/31613265/1043704

    – Lorien Brune
    Sep 30 '17 at 1:42














  • 1





    C++ (and even more so C) isn't like some other languages. It's not the sort of thing where standard libraries just exist by default for everything under the sun. There might be some library in common usage, but from the perspective of standard libraries, language features, even OS-specific APIs like POSIX, it's assumed that you can do a lot yourself.

    – asveikau
    Apr 11 '10 at 4:09






  • 25





    Im happy to build a wheel but dont see the point in building it if someone else has done it. Hence my question. Youre right, "There might be some library in common usage" - thats what I was asking.

    – Andrew Bucknell
    Apr 11 '10 at 6:52






  • 1





    It's the sort of small utility you'd find in the big framework you codebase relies on. If it isn't there then it's a fun exercise in standard algorithms to write a small URL utility collection.

    – wilhelmtell
    Apr 11 '10 at 7:02











  • curl.haxx.se/libcurl/c/curl_unescape.html

    – hB0
    Oct 28 '13 at 14:15











  • To parse URLs using the RFC 3986 standard, simply and without importing any new libraries, check out this answer to a related question: stackoverflow.com/a/31613265/1043704

    – Lorien Brune
    Sep 30 '17 at 1:42








1




1





C++ (and even more so C) isn't like some other languages. It's not the sort of thing where standard libraries just exist by default for everything under the sun. There might be some library in common usage, but from the perspective of standard libraries, language features, even OS-specific APIs like POSIX, it's assumed that you can do a lot yourself.

– asveikau
Apr 11 '10 at 4:09





C++ (and even more so C) isn't like some other languages. It's not the sort of thing where standard libraries just exist by default for everything under the sun. There might be some library in common usage, but from the perspective of standard libraries, language features, even OS-specific APIs like POSIX, it's assumed that you can do a lot yourself.

– asveikau
Apr 11 '10 at 4:09




25




25





Im happy to build a wheel but dont see the point in building it if someone else has done it. Hence my question. Youre right, "There might be some library in common usage" - thats what I was asking.

– Andrew Bucknell
Apr 11 '10 at 6:52





Im happy to build a wheel but dont see the point in building it if someone else has done it. Hence my question. Youre right, "There might be some library in common usage" - thats what I was asking.

– Andrew Bucknell
Apr 11 '10 at 6:52




1




1





It's the sort of small utility you'd find in the big framework you codebase relies on. If it isn't there then it's a fun exercise in standard algorithms to write a small URL utility collection.

– wilhelmtell
Apr 11 '10 at 7:02





It's the sort of small utility you'd find in the big framework you codebase relies on. If it isn't there then it's a fun exercise in standard algorithms to write a small URL utility collection.

– wilhelmtell
Apr 11 '10 at 7:02













curl.haxx.se/libcurl/c/curl_unescape.html

– hB0
Oct 28 '13 at 14:15





curl.haxx.se/libcurl/c/curl_unescape.html

– hB0
Oct 28 '13 at 14:15













To parse URLs using the RFC 3986 standard, simply and without importing any new libraries, check out this answer to a related question: stackoverflow.com/a/31613265/1043704

– Lorien Brune
Sep 30 '17 at 1:42





To parse URLs using the RFC 3986 standard, simply and without importing any new libraries, check out this answer to a related question: stackoverflow.com/a/31613265/1043704

– Lorien Brune
Sep 30 '17 at 1:42












17 Answers
17






active

oldest

votes


















27














There is a library that's proposed for Boost inclusion and allows you to parse HTTP URI's easily. It uses Boost.Spirit and is also released under the Boost Software License. The library is cpp-netlib which you can find the documentation for at http://cpp-netlib.github.com/ -- you can download the latest release from http://github.com/cpp-netlib/cpp-netlib/downloads .



The relevant type you'll want to use is boost::network::http::uri and is documented here.






share|improve this answer


























  • Thank you Dean!

    – Andrew Bucknell
    Apr 11 '10 at 13:44



















19














Terribly sorry, couldn't help it. :s



url.hh



#ifndef URL_HH_
#define URL_HH_
#include <string>
struct url {
url(const std::string& url_s); // omitted copy, ==, accessors, ...
private:
void parse(const std::string& url_s);
private:
std::string protocol_, host_, path_, query_;
};
#endif /* URL_HH_ */


url.cc



#include "url.hh"
#include <string>
#include <algorithm>
#include <cctype>
#include <functional>
using namespace std;

// ctors, copy, equality, ...

void url::parse(const string& url_s)
{
const string prot_end("://");
string::const_iterator prot_i = search(url_s.begin(), url_s.end(),
prot_end.begin(), prot_end.end());
protocol_.reserve(distance(url_s.begin(), prot_i));
transform(url_s.begin(), prot_i,
back_inserter(protocol_),
ptr_fun<int,int>(tolower)); // protocol is icase
if( prot_i == url_s.end() )
return;
advance(prot_i, prot_end.length());
string::const_iterator path_i = find(prot_i, url_s.end(), '/');
host_.reserve(distance(prot_i, path_i));
transform(prot_i, path_i,
back_inserter(host_),
ptr_fun<int,int>(tolower)); // host is icase
string::const_iterator query_i = find(path_i, url_s.end(), '?');
path_.assign(path_i, query_i);
if( query_i != url_s.end() )
++query_i;
query_.assign(query_i, url_s.end());
}


main.cc



// ...
url u("HTTP://stackoverflow.com/questions/2616011/parse-a.py?url=1");
cout << u.protocol() << 't' << u.host() << ...





share|improve this answer





















  • 1





    Minor nitpick: You don't need to use ptr_fun here, and if you do, you need to #include <functional>. (you probably shouldn't using namespace std either but I'm assuming this isn't for production code)

    – Billy ONeal
    Apr 11 '10 at 6:27













  • I omitted some trivial functionality, like the assignment operator, constructors, accessors and so on. The url class shouldn't have mutators. For the equality operator, you might add a hash member that you fill in while parsing the original string. Then, comparing two urls for equality should be very fast. It also means some extra complexity; it's your call.

    – wilhelmtell
    Apr 11 '10 at 7:07






  • 4





    @Billy I always bring namespace std into my compilation units (not the headers!). I think it's perfectly fine, and I think that having std:: all over the place poses more pollution and eye-fatigue than bringing in the namespace.

    – wilhelmtell
    Apr 11 '10 at 7:12








  • 13





    Funny how things are, on the very contrary I agree with Billy ONeal and remove all using namespace I came accross. If you really repeat a symbol, you can always have using std::string; but I prefer to have namespace qualification, makes it easier for poor old me to understand where that symbol came from.

    – Matthieu M.
    Apr 11 '10 at 11:45






  • 7





    There are a lot of URI/URL forms not supported besides example.com:port/pathname. For instance http:/pathname and more importantly username:password@example.com/pathname#section - all the combinations are listed in ietf.org/rfc/rfc2396.txt - they show the following regex: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

    – jdkoftinoff
    Oct 18 '10 at 2:52





















18














Wstring version of above, added other fields I needed. Could definitely be refined, but good enough for my purposes.



#include <string>
#include <algorithm> // find

struct Uri
{
public:
std::wstring QueryString, Path, Protocol, Host, Port;

static Uri Parse(const std::wstring &uri)
{
Uri result;

typedef std::wstring::const_iterator iterator_t;

if (uri.length() == 0)
return result;

iterator_t uriEnd = uri.end();

// get query start
iterator_t queryStart = std::find(uri.begin(), uriEnd, L'?');

// protocol
iterator_t protocolStart = uri.begin();
iterator_t protocolEnd = std::find(protocolStart, uriEnd, L':'); //"://");

if (protocolEnd != uriEnd)
{
std::wstring prot = &*(protocolEnd);
if ((prot.length() > 3) && (prot.substr(0, 3) == L"://"))
{
result.Protocol = std::wstring(protocolStart, protocolEnd);
protocolEnd += 3; // ://
}
else
protocolEnd = uri.begin(); // no protocol
}
else
protocolEnd = uri.begin(); // no protocol

// host
iterator_t hostStart = protocolEnd;
iterator_t pathStart = std::find(hostStart, uriEnd, L'/'); // get pathStart

iterator_t hostEnd = std::find(protocolEnd,
(pathStart != uriEnd) ? pathStart : queryStart,
L':'); // check for port

result.Host = std::wstring(hostStart, hostEnd);

// port
if ((hostEnd != uriEnd) && ((&*(hostEnd))[0] == L':')) // we have a port
{
hostEnd++;
iterator_t portEnd = (pathStart != uriEnd) ? pathStart : queryStart;
result.Port = std::wstring(hostEnd, portEnd);
}

// path
if (pathStart != uriEnd)
result.Path = std::wstring(pathStart, queryStart);

// query
if (queryStart != uriEnd)
result.QueryString = std::wstring(queryStart, uri.end());

return result;

} // Parse
}; // uri


Tests/Usage



Uri u0 = Uri::Parse(L"http://localhost:80/foo.html?&q=1:2:3");
Uri u1 = Uri::Parse(L"https://localhost:80/foo.html?&q=1");
Uri u2 = Uri::Parse(L"localhost/foo");
Uri u3 = Uri::Parse(L"https://localhost/foo");
Uri u4 = Uri::Parse(L"localhost:8080");
Uri u5 = Uri::Parse(L"localhost?&foo=1");
Uri u6 = Uri::Parse(L"localhost?&foo=1:2:3");

u0.QueryString, u0.Path, u0.Protocol, u0.Host, u0.Port....





share|improve this answer


























  • why use wstring?

    – yeyimilk
    Apr 19 '17 at 6:40











  • @yeyimilk - It seemed like a good idea at the time!

    – Tom
    Apr 19 '17 at 16:35



















11














For completeness, there is one written in C that you could use (with a little wrapping, no doubt): http://uriparser.sourceforge.net/



[RFC-compliant and supports Unicode]





Here's a very basic wrapper I've been using for simply grabbing the results of a parse.



#include <string>
#include <uriparser/Uri.h>


namespace uriparser
{
class Uri //: boost::noncopyable
{
public:
Uri(std::string uri)
: uri_(uri)
{
UriParserStateA state_;
state_.uri = &uriParse_;
isValid_ = uriParseUriA(&state_, uri_.c_str()) == URI_SUCCESS;
}

~Uri() { uriFreeUriMembersA(&uriParse_); }

bool isValid() const { return isValid_; }

std::string scheme() const { return fromRange(uriParse_.scheme); }
std::string host() const { return fromRange(uriParse_.hostText); }
std::string port() const { return fromRange(uriParse_.portText); }
std::string path() const { return fromList(uriParse_.pathHead, "/"); }
std::string query() const { return fromRange(uriParse_.query); }
std::string fragment() const { return fromRange(uriParse_.fragment); }

private:
std::string uri_;
UriUriA uriParse_;
bool isValid_;

std::string fromRange(const UriTextRangeA & rng) const
{
return std::string(rng.first, rng.afterLast);
}

std::string fromList(UriPathSegmentA * xs, const std::string & delim) const
{
UriPathSegmentStructA * head(xs);
std::string accum;

while (head)
{
accum += delim + fromRange(head->text);
head = head->next;
}

return accum;
}
};
}





share|improve this answer





















  • 3





    +1, I ended up cloning your URL parser lib off github. Much nicer not having to pull in all of boost...

    – Alan
    Oct 21 '13 at 3:43











  • @Alan I don't know of a URL parser in Boost. cpp-netlib has one, but I've had issues with it (very possibly fixed by now) so I use this one instead.

    – Elliot Cameron
    Apr 15 '15 at 17:36



















6














POCO's URI class can parse URLs for you. The following example is shortened version of the one in POCO URI and UUID slides:



#include "Poco/URI.h"
#include <iostream>

int main(int argc, char** argv)
{
Poco::URI uri1("http://www.appinf.com:88/sample?example-query#frag");

std::string scheme(uri1.getScheme()); // "http"
std::string auth(uri1.getAuthority()); // "www.appinf.com:88"
std::string host(uri1.getHost()); // "www.appinf.com"
unsigned short port = uri1.getPort(); // 88
std::string path(uri1.getPath()); // "/sample"
std::string query(uri1.getQuery()); // "example-query"
std::string frag(uri1.getFragment()); // "frag"
std::string pathEtc(uri1.getPathEtc()); // "/sample?example-query#frag"

return 0;
}





share|improve this answer































    5














    The Poco library now has a class for dissecting URI's and feeding back the host, path segments and query string etc.



    https://pocoproject.org/pro/docs/Poco.URI.html






    share|improve this answer

































      4














      //sudo apt-get install libboost-all-dev; #install boost
      //g++ urlregex.cpp -lboost_regex; #compile
      #include <string>
      #include <iostream>
      #include <boost/regex.hpp>

      using namespace std;

      int main(int argc, char* argv)
      {
      string url="https://www.google.com:443/webhp?gws_rd=ssl#q=cpp";
      boost::regex ex("(http|https)://([^/ :]+):?([^/ ]*)(/?[^ #?]*)\x3f?([^ #]*)#?([^ ]*)");
      boost::cmatch what;
      if(regex_match(url.c_str(), what, ex))
      {
      cout << "protocol: " << string(what[1].first, what[1].second) << endl;
      cout << "domain: " << string(what[2].first, what[2].second) << endl;
      cout << "port: " << string(what[3].first, what[3].second) << endl;
      cout << "path: " << string(what[4].first, what[4].second) << endl;
      cout << "query: " << string(what[5].first, what[5].second) << endl;
      cout << "fragment: " << string(what[6].first, what[6].second) << endl;
      }
      return 0;
      }





      share|improve this answer


























      • it doesn't work

        – asit_dhal
        Jan 4 '15 at 3:04











      • I just tried it with a number of different URLs and it works very well.

        – Caroline Beltran
        Feb 9 '18 at 19:01



















      4














      Facebook's Folly library can do the job for you easily. Simply use the Uri class:



      #include <folly/Uri.h>

      int main() {
      folly::Uri folly("https://code.facebook.com/posts/177011135812493/");

      folly.scheme(); // https
      folly.host(); // code.facebook.com
      folly.path(); // posts/177011135812493/
      }





      share|improve this answer































        2














        Also of interest could be http://code.google.com/p/uri-grammar/ which like Dean Michael's netlib uses boost spirit to parse a URI. Came across it at Simple expression parser example using Boost::Spirit?






        share|improve this answer

































          1














          QT has QUrl for this. GNOME has SoupURI in libsoup, which you'll probably find a little more light-weight.






          share|improve this answer

































            1














            There is the newly released google-url lib:



            http://code.google.com/p/google-url/



            The library provides a low-level url parsing API as well as a higher-level abstraction called GURL. Here's an example using that:



            #include <googleurlsrcgurl.h>

            wchar_t url = L"http://www.facebook.com";
            GURL parsedUrl (url);
            assert(parsedUrl.DomainIs("facebook.com"));


            Two small complaints I have with it: (1) it wants to use ICU by default to deal with different string encodings and (2) it makes some assumptions about logging (but I think they can be disabled). In other words, the library is not completely stand-alone as it exists, but I think it's still a good basis to start with, especially if you are already using ICU.






            share|improve this answer


























            • its merged with chromium source and no longer maintained separately

              – Silver Moon
              May 13 '15 at 5:33



















            1














            This library is very tiny and lightweight: https://github.com/corporateshark/LUrlParser



            However, it is parsing only, no URL normalization/validation.






            share|improve this answer































              1














              You could try the open-source library called C++ REST SDK (created by Microsoft, distributed under the Apache License 2.0). It can be built for several platforms including Windows, Linux, OSX, iOS, Android). There is a class called web::uri where you put in a string and can retrieve individual URL components. Here is a code sample (tested on Windows):



              #include <cpprest/base_uri.h>
              #include <iostream>
              #include <ostream>

              web::uri sample_uri( L"http://dummyuser@localhost:7777/dummypath?dummyquery#dummyfragment" );
              std::wcout << L"scheme: " << sample_uri.scheme() << std::endl;
              std::wcout << L"user: " << sample_uri.user_info() << std::endl;
              std::wcout << L"host: " << sample_uri.host() << std::endl;
              std::wcout << L"port: " << sample_uri.port() << std::endl;
              std::wcout << L"path: " << sample_uri.path() << std::endl;
              std::wcout << L"query: " << sample_uri.query() << std::endl;
              std::wcout << L"fragment: " << sample_uri.fragment() << std::endl;


              The output will be:



              scheme: http
              user: dummyuser
              host: localhost
              port: 7777
              path: /dummypath
              query: dummyquery
              fragment: dummyfragment


              There are also other easy-to-use methods, e.g. to access individual attribute/value pairs from the query, split the path into components, etc.






              share|improve this answer

































                1














                May I offer another self-contained solution based on std::regex :



                const char* SCHEME_REGEX   = "((http[s]?)://)?";  // match http or https before the ://
                const char* USER_REGEX = "(([^@/:\s]+)@)?"; // match anything other than @ / : or whitespace before the ending @
                const char* HOST_REGEX = "([^@/:\s]+)"; // mandatory. match anything other than @ / : or whitespace
                const char* PORT_REGEX = "(:([0-9]{1,5}))?"; // after the : match 1 to 5 digits
                const char* PATH_REGEX = "(/[^:#?\s]*)?"; // after the / match anything other than : # ? or whitespace
                const char* QUERY_REGEX = "(\?(([^?;&#=]+=[^?;&#=]+)([;|&]([^?;&#=]+=[^?;&#=]+))*))?"; // after the ? match any number of x=y pairs, seperated by & or ;
                const char* FRAGMENT_REGEX = "(#([^#\s]*))?"; // after the # match anything other than # or whitespace

                bool parseUri(const std::string &i_uri)
                {
                static const std::regex regExpr(std::string("^")
                + SCHEME_REGEX + USER_REGEX
                + HOST_REGEX + PORT_REGEX
                + PATH_REGEX + QUERY_REGEX
                + FRAGMENT_REGEX + "$");

                std::smatch matchResults;
                if (std::regex_match(i_uri.cbegin(), i_uri.cend(), matchResults, regExpr))
                {
                m_scheme.assign(matchResults[2].first, matchResults[2].second);
                m_user.assign(matchResults[4].first, matchResults[4].second);
                m_host.assign(matchResults[5].first, matchResults[5].second);
                m_port.assign(matchResults[7].first, matchResults[7].second);
                m_path.assign(matchResults[8].first, matchResults[8].second);
                m_query.assign(matchResults[10].first, matchResults[10].second);
                m_fragment.assign(matchResults[15].first, matchResults[15].second);

                return true;
                }

                return false;
                }


                I added explanations for each part of the regular expression. This way allows you to choose exactly the relevant parts to parse for the URL that you're expecting to get. Just remember to change the desired regular expression group indices accordingly.






                share|improve this answer































                  0














                  There is yet another library https://snapwebsites.org/project/libtld which handles all possible top level domains and URI shema






                  share|improve this answer































                    0














                    I have developed an "object oriented" solution, one C++ class, that works with one regex like @Mr.Jones and @velcrow solutions. My Url class performs url/uri 'parsing'.



                    I think I improved velcrow regex to be more robust and includes also the username part.



                    Follows the first version of my idea, I have released the same code, improved, in my GPL3 licensed open source project Cpp URL Parser.



                    Omitted #ifdef/ndef bloat part, follows Url.h



                    #include <string>
                    #include <iostream>
                    #include <boost/regex.hpp>

                    using namespace std;

                    class Url {
                    public:
                    boost::regex ex;
                    string rawUrl;

                    string username;
                    string protocol;
                    string domain;
                    string port;
                    string path;
                    string query;
                    string fragment;

                    Url();

                    Url(string &rawUrl);

                    Url &update(string &rawUrl);
                    };


                    This is the code of the Url.cpp implementation file:



                    #include "Url.h"

                    Url::Url() {
                    this -> ex = boost::regex("(ssh|sftp|ftp|smb|http|https):\/\/(?:([^@ ]*)@)?([^:?# ]+)(?::(\d+))?([^?# ]*)(?:\?([^# ]*))?(?:#([^ ]*))?");
                    }

                    Url::Url(string &rawUrl) : Url() {
                    this->rawUrl = rawUrl;
                    this->update(this->rawUrl);
                    }

                    Url &Url::update(string &rawUrl) {
                    this->rawUrl = rawUrl;
                    boost::cmatch what;
                    if (regex_match(rawUrl.c_str(), what, ex)) {
                    this -> protocol = string(what[1].first, what[1].second);
                    this -> username = string(what[2].first, what[2].second);
                    this -> domain = string(what[3].first, what[3].second);
                    this -> port = string(what[4].first, what[4].second);
                    this -> path = string(what[5].first, what[5].second);
                    this -> query = string(what[6].first, what[6].second);
                    this -> fragment = string(what[7].first, what[7].second);
                    }
                    return *this;
                    }


                    Usage example:



                    string urlString = "http://gino@ciao.it:67/ciao?roba=ciao#34";
                    Url *url = new Url(urlString);
                    std::cout << " username: " << url->username << " URL domain: " << url->domain;
                    std::cout << " port: " << url->port << " protocol: " << url->protocol;


                    You can also update the Url object to represent (and parse) another URL:



                    url.update("http://gino@nuovociao.it:68/nuovociao?roba=ciaoooo#")


                    I'm learning C++ just now, so, I'm not sure I followed 100% C++ best-practises.
                    Any tip is appreciated.



                    P.s: let's look at Cpp URL Parser, there are refinements there.



                    Have fun






                    share|improve this answer

































                      0














                      A small dependency you can use is uriparser, which recently moved to GitHub.



                      You can find a minimal example in their code: https://github.com/uriparser/uriparser/blob/63384be4fb8197264c55ff53a135110ecd5bd8c4/tool/uriparse.c



                      This will be more lightweight than Boost or Poco. The only catch is that it is C.



                      There is also a Buckaroo package:



                      buckaroo add github.com/buckaroo-pm/uriparser





                      share|improve this answer
























                        Your Answer






                        StackExchange.ifUsing("editor", function () {
                        StackExchange.using("externalEditor", function () {
                        StackExchange.using("snippets", function () {
                        StackExchange.snippets.init();
                        });
                        });
                        }, "code-snippets");

                        StackExchange.ready(function() {
                        var channelOptions = {
                        tags: "".split(" "),
                        id: "1"
                        };
                        initTagRenderer("".split(" "), "".split(" "), channelOptions);

                        StackExchange.using("externalEditor", function() {
                        // Have to fire editor after snippets, if snippets enabled
                        if (StackExchange.settings.snippets.snippetsEnabled) {
                        StackExchange.using("snippets", function() {
                        createEditor();
                        });
                        }
                        else {
                        createEditor();
                        }
                        });

                        function createEditor() {
                        StackExchange.prepareEditor({
                        heartbeatType: 'answer',
                        autoActivateHeartbeat: false,
                        convertImagesToLinks: true,
                        noModals: true,
                        showLowRepImageUploadWarning: true,
                        reputationToPostImages: 10,
                        bindNavPrevention: true,
                        postfix: "",
                        imageUploader: {
                        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                        allowUrls: true
                        },
                        onDemand: true,
                        discardSelector: ".discard-answer"
                        ,immediatelyShowMarkdownHelp:true
                        });


                        }
                        });














                        draft saved

                        draft discarded


















                        StackExchange.ready(
                        function () {
                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f2616011%2feasy-way-to-parse-a-url-in-c-cross-platform%23new-answer', 'question_page');
                        }
                        );

                        Post as a guest















                        Required, but never shown

























                        17 Answers
                        17






                        active

                        oldest

                        votes








                        17 Answers
                        17






                        active

                        oldest

                        votes









                        active

                        oldest

                        votes






                        active

                        oldest

                        votes









                        27














                        There is a library that's proposed for Boost inclusion and allows you to parse HTTP URI's easily. It uses Boost.Spirit and is also released under the Boost Software License. The library is cpp-netlib which you can find the documentation for at http://cpp-netlib.github.com/ -- you can download the latest release from http://github.com/cpp-netlib/cpp-netlib/downloads .



                        The relevant type you'll want to use is boost::network::http::uri and is documented here.






                        share|improve this answer


























                        • Thank you Dean!

                          – Andrew Bucknell
                          Apr 11 '10 at 13:44
















                        27














                        There is a library that's proposed for Boost inclusion and allows you to parse HTTP URI's easily. It uses Boost.Spirit and is also released under the Boost Software License. The library is cpp-netlib which you can find the documentation for at http://cpp-netlib.github.com/ -- you can download the latest release from http://github.com/cpp-netlib/cpp-netlib/downloads .



                        The relevant type you'll want to use is boost::network::http::uri and is documented here.






                        share|improve this answer


























                        • Thank you Dean!

                          – Andrew Bucknell
                          Apr 11 '10 at 13:44














                        27












                        27








                        27







                        There is a library that's proposed for Boost inclusion and allows you to parse HTTP URI's easily. It uses Boost.Spirit and is also released under the Boost Software License. The library is cpp-netlib which you can find the documentation for at http://cpp-netlib.github.com/ -- you can download the latest release from http://github.com/cpp-netlib/cpp-netlib/downloads .



                        The relevant type you'll want to use is boost::network::http::uri and is documented here.






                        share|improve this answer















                        There is a library that's proposed for Boost inclusion and allows you to parse HTTP URI's easily. It uses Boost.Spirit and is also released under the Boost Software License. The library is cpp-netlib which you can find the documentation for at http://cpp-netlib.github.com/ -- you can download the latest release from http://github.com/cpp-netlib/cpp-netlib/downloads .



                        The relevant type you'll want to use is boost::network::http::uri and is documented here.







                        share|improve this answer














                        share|improve this answer



                        share|improve this answer








                        edited Jan 17 '14 at 17:41









                        g3rv4

                        17.2k42854




                        17.2k42854










                        answered Apr 11 '10 at 9:56









                        Dean MichaelDean Michael

                        3,10611613




                        3,10611613













                        • Thank you Dean!

                          – Andrew Bucknell
                          Apr 11 '10 at 13:44



















                        • Thank you Dean!

                          – Andrew Bucknell
                          Apr 11 '10 at 13:44

















                        Thank you Dean!

                        – Andrew Bucknell
                        Apr 11 '10 at 13:44





                        Thank you Dean!

                        – Andrew Bucknell
                        Apr 11 '10 at 13:44













                        19














                        Terribly sorry, couldn't help it. :s



                        url.hh



                        #ifndef URL_HH_
                        #define URL_HH_
                        #include <string>
                        struct url {
                        url(const std::string& url_s); // omitted copy, ==, accessors, ...
                        private:
                        void parse(const std::string& url_s);
                        private:
                        std::string protocol_, host_, path_, query_;
                        };
                        #endif /* URL_HH_ */


                        url.cc



                        #include "url.hh"
                        #include <string>
                        #include <algorithm>
                        #include <cctype>
                        #include <functional>
                        using namespace std;

                        // ctors, copy, equality, ...

                        void url::parse(const string& url_s)
                        {
                        const string prot_end("://");
                        string::const_iterator prot_i = search(url_s.begin(), url_s.end(),
                        prot_end.begin(), prot_end.end());
                        protocol_.reserve(distance(url_s.begin(), prot_i));
                        transform(url_s.begin(), prot_i,
                        back_inserter(protocol_),
                        ptr_fun<int,int>(tolower)); // protocol is icase
                        if( prot_i == url_s.end() )
                        return;
                        advance(prot_i, prot_end.length());
                        string::const_iterator path_i = find(prot_i, url_s.end(), '/');
                        host_.reserve(distance(prot_i, path_i));
                        transform(prot_i, path_i,
                        back_inserter(host_),
                        ptr_fun<int,int>(tolower)); // host is icase
                        string::const_iterator query_i = find(path_i, url_s.end(), '?');
                        path_.assign(path_i, query_i);
                        if( query_i != url_s.end() )
                        ++query_i;
                        query_.assign(query_i, url_s.end());
                        }


                        main.cc



                        // ...
                        url u("HTTP://stackoverflow.com/questions/2616011/parse-a.py?url=1");
                        cout << u.protocol() << 't' << u.host() << ...





                        share|improve this answer





















                        • 1





                          Minor nitpick: You don't need to use ptr_fun here, and if you do, you need to #include <functional>. (you probably shouldn't using namespace std either but I'm assuming this isn't for production code)

                          – Billy ONeal
                          Apr 11 '10 at 6:27













                        • I omitted some trivial functionality, like the assignment operator, constructors, accessors and so on. The url class shouldn't have mutators. For the equality operator, you might add a hash member that you fill in while parsing the original string. Then, comparing two urls for equality should be very fast. It also means some extra complexity; it's your call.

                          – wilhelmtell
                          Apr 11 '10 at 7:07






                        • 4





                          @Billy I always bring namespace std into my compilation units (not the headers!). I think it's perfectly fine, and I think that having std:: all over the place poses more pollution and eye-fatigue than bringing in the namespace.

                          – wilhelmtell
                          Apr 11 '10 at 7:12








                        • 13





                          Funny how things are, on the very contrary I agree with Billy ONeal and remove all using namespace I came accross. If you really repeat a symbol, you can always have using std::string; but I prefer to have namespace qualification, makes it easier for poor old me to understand where that symbol came from.

                          – Matthieu M.
                          Apr 11 '10 at 11:45






                        • 7





                          There are a lot of URI/URL forms not supported besides example.com:port/pathname. For instance http:/pathname and more importantly username:password@example.com/pathname#section - all the combinations are listed in ietf.org/rfc/rfc2396.txt - they show the following regex: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

                          – jdkoftinoff
                          Oct 18 '10 at 2:52


















                        19














                        Terribly sorry, couldn't help it. :s



                        url.hh



                        #ifndef URL_HH_
                        #define URL_HH_
                        #include <string>
                        struct url {
                        url(const std::string& url_s); // omitted copy, ==, accessors, ...
                        private:
                        void parse(const std::string& url_s);
                        private:
                        std::string protocol_, host_, path_, query_;
                        };
                        #endif /* URL_HH_ */


                        url.cc



                        #include "url.hh"
                        #include <string>
                        #include <algorithm>
                        #include <cctype>
                        #include <functional>
                        using namespace std;

                        // ctors, copy, equality, ...

                        void url::parse(const string& url_s)
                        {
                        const string prot_end("://");
                        string::const_iterator prot_i = search(url_s.begin(), url_s.end(),
                        prot_end.begin(), prot_end.end());
                        protocol_.reserve(distance(url_s.begin(), prot_i));
                        transform(url_s.begin(), prot_i,
                        back_inserter(protocol_),
                        ptr_fun<int,int>(tolower)); // protocol is icase
                        if( prot_i == url_s.end() )
                        return;
                        advance(prot_i, prot_end.length());
                        string::const_iterator path_i = find(prot_i, url_s.end(), '/');
                        host_.reserve(distance(prot_i, path_i));
                        transform(prot_i, path_i,
                        back_inserter(host_),
                        ptr_fun<int,int>(tolower)); // host is icase
                        string::const_iterator query_i = find(path_i, url_s.end(), '?');
                        path_.assign(path_i, query_i);
                        if( query_i != url_s.end() )
                        ++query_i;
                        query_.assign(query_i, url_s.end());
                        }


                        main.cc



                        // ...
                        url u("HTTP://stackoverflow.com/questions/2616011/parse-a.py?url=1");
                        cout << u.protocol() << 't' << u.host() << ...





                        share|improve this answer





















                        • 1





                          Minor nitpick: You don't need to use ptr_fun here, and if you do, you need to #include <functional>. (you probably shouldn't using namespace std either but I'm assuming this isn't for production code)

                          – Billy ONeal
                          Apr 11 '10 at 6:27













                        • I omitted some trivial functionality, like the assignment operator, constructors, accessors and so on. The url class shouldn't have mutators. For the equality operator, you might add a hash member that you fill in while parsing the original string. Then, comparing two urls for equality should be very fast. It also means some extra complexity; it's your call.

                          – wilhelmtell
                          Apr 11 '10 at 7:07






                        • 4





                          @Billy I always bring namespace std into my compilation units (not the headers!). I think it's perfectly fine, and I think that having std:: all over the place poses more pollution and eye-fatigue than bringing in the namespace.

                          – wilhelmtell
                          Apr 11 '10 at 7:12








                        • 13





                          Funny how things are, on the very contrary I agree with Billy ONeal and remove all using namespace I came accross. If you really repeat a symbol, you can always have using std::string; but I prefer to have namespace qualification, makes it easier for poor old me to understand where that symbol came from.

                          – Matthieu M.
                          Apr 11 '10 at 11:45






                        • 7





                          There are a lot of URI/URL forms not supported besides example.com:port/pathname. For instance http:/pathname and more importantly username:password@example.com/pathname#section - all the combinations are listed in ietf.org/rfc/rfc2396.txt - they show the following regex: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

                          – jdkoftinoff
                          Oct 18 '10 at 2:52
















                        19












                        19








                        19







                        Terribly sorry, couldn't help it. :s



                        url.hh



                        #ifndef URL_HH_
                        #define URL_HH_
                        #include <string>
                        struct url {
                        url(const std::string& url_s); // omitted copy, ==, accessors, ...
                        private:
                        void parse(const std::string& url_s);
                        private:
                        std::string protocol_, host_, path_, query_;
                        };
                        #endif /* URL_HH_ */


                        url.cc



                        #include "url.hh"
                        #include <string>
                        #include <algorithm>
                        #include <cctype>
                        #include <functional>
                        using namespace std;

                        // ctors, copy, equality, ...

                        void url::parse(const string& url_s)
                        {
                        const string prot_end("://");
                        string::const_iterator prot_i = search(url_s.begin(), url_s.end(),
                        prot_end.begin(), prot_end.end());
                        protocol_.reserve(distance(url_s.begin(), prot_i));
                        transform(url_s.begin(), prot_i,
                        back_inserter(protocol_),
                        ptr_fun<int,int>(tolower)); // protocol is icase
                        if( prot_i == url_s.end() )
                        return;
                        advance(prot_i, prot_end.length());
                        string::const_iterator path_i = find(prot_i, url_s.end(), '/');
                        host_.reserve(distance(prot_i, path_i));
                        transform(prot_i, path_i,
                        back_inserter(host_),
                        ptr_fun<int,int>(tolower)); // host is icase
                        string::const_iterator query_i = find(path_i, url_s.end(), '?');
                        path_.assign(path_i, query_i);
                        if( query_i != url_s.end() )
                        ++query_i;
                        query_.assign(query_i, url_s.end());
                        }


                        main.cc



                        // ...
                        url u("HTTP://stackoverflow.com/questions/2616011/parse-a.py?url=1");
                        cout << u.protocol() << 't' << u.host() << ...





                        share|improve this answer















                        Terribly sorry, couldn't help it. :s



                        url.hh



                        #ifndef URL_HH_
                        #define URL_HH_
                        #include <string>
                        struct url {
                        url(const std::string& url_s); // omitted copy, ==, accessors, ...
                        private:
                        void parse(const std::string& url_s);
                        private:
                        std::string protocol_, host_, path_, query_;
                        };
                        #endif /* URL_HH_ */


                        url.cc



                        #include "url.hh"
                        #include <string>
                        #include <algorithm>
                        #include <cctype>
                        #include <functional>
                        using namespace std;

                        // ctors, copy, equality, ...

                        void url::parse(const string& url_s)
                        {
                        const string prot_end("://");
                        string::const_iterator prot_i = search(url_s.begin(), url_s.end(),
                        prot_end.begin(), prot_end.end());
                        protocol_.reserve(distance(url_s.begin(), prot_i));
                        transform(url_s.begin(), prot_i,
                        back_inserter(protocol_),
                        ptr_fun<int,int>(tolower)); // protocol is icase
                        if( prot_i == url_s.end() )
                        return;
                        advance(prot_i, prot_end.length());
                        string::const_iterator path_i = find(prot_i, url_s.end(), '/');
                        host_.reserve(distance(prot_i, path_i));
                        transform(prot_i, path_i,
                        back_inserter(host_),
                        ptr_fun<int,int>(tolower)); // host is icase
                        string::const_iterator query_i = find(path_i, url_s.end(), '?');
                        path_.assign(path_i, query_i);
                        if( query_i != url_s.end() )
                        ++query_i;
                        query_.assign(query_i, url_s.end());
                        }


                        main.cc



                        // ...
                        url u("HTTP://stackoverflow.com/questions/2616011/parse-a.py?url=1");
                        cout << u.protocol() << 't' << u.host() << ...






                        share|improve this answer














                        share|improve this answer



                        share|improve this answer








                        edited Apr 11 '10 at 6:49

























                        answered Apr 11 '10 at 6:17









                        wilhelmtellwilhelmtell

                        43.5k1783123




                        43.5k1783123








                        • 1





                          Minor nitpick: You don't need to use ptr_fun here, and if you do, you need to #include <functional>. (you probably shouldn't using namespace std either but I'm assuming this isn't for production code)

                          – Billy ONeal
                          Apr 11 '10 at 6:27













                        • I omitted some trivial functionality, like the assignment operator, constructors, accessors and so on. The url class shouldn't have mutators. For the equality operator, you might add a hash member that you fill in while parsing the original string. Then, comparing two urls for equality should be very fast. It also means some extra complexity; it's your call.

                          – wilhelmtell
                          Apr 11 '10 at 7:07






                        • 4





                          @Billy I always bring namespace std into my compilation units (not the headers!). I think it's perfectly fine, and I think that having std:: all over the place poses more pollution and eye-fatigue than bringing in the namespace.

                          – wilhelmtell
                          Apr 11 '10 at 7:12








                        • 13





                          Funny how things are, on the very contrary I agree with Billy ONeal and remove all using namespace I came accross. If you really repeat a symbol, you can always have using std::string; but I prefer to have namespace qualification, makes it easier for poor old me to understand where that symbol came from.

                          – Matthieu M.
                          Apr 11 '10 at 11:45






                        • 7





                          There are a lot of URI/URL forms not supported besides example.com:port/pathname. For instance http:/pathname and more importantly username:password@example.com/pathname#section - all the combinations are listed in ietf.org/rfc/rfc2396.txt - they show the following regex: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

                          – jdkoftinoff
                          Oct 18 '10 at 2:52
















                        • 1





                          Minor nitpick: You don't need to use ptr_fun here, and if you do, you need to #include <functional>. (you probably shouldn't using namespace std either but I'm assuming this isn't for production code)

                          – Billy ONeal
                          Apr 11 '10 at 6:27













                        • I omitted some trivial functionality, like the assignment operator, constructors, accessors and so on. The url class shouldn't have mutators. For the equality operator, you might add a hash member that you fill in while parsing the original string. Then, comparing two urls for equality should be very fast. It also means some extra complexity; it's your call.

                          – wilhelmtell
                          Apr 11 '10 at 7:07






                        • 4





                          @Billy I always bring namespace std into my compilation units (not the headers!). I think it's perfectly fine, and I think that having std:: all over the place poses more pollution and eye-fatigue than bringing in the namespace.

                          – wilhelmtell
                          Apr 11 '10 at 7:12








                        • 13





                          Funny how things are, on the very contrary I agree with Billy ONeal and remove all using namespace I came accross. If you really repeat a symbol, you can always have using std::string; but I prefer to have namespace qualification, makes it easier for poor old me to understand where that symbol came from.

                          – Matthieu M.
                          Apr 11 '10 at 11:45






                        • 7





                          There are a lot of URI/URL forms not supported besides example.com:port/pathname. For instance http:/pathname and more importantly username:password@example.com/pathname#section - all the combinations are listed in ietf.org/rfc/rfc2396.txt - they show the following regex: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

                          – jdkoftinoff
                          Oct 18 '10 at 2:52










                        1




                        1





                        Minor nitpick: You don't need to use ptr_fun here, and if you do, you need to #include <functional>. (you probably shouldn't using namespace std either but I'm assuming this isn't for production code)

                        – Billy ONeal
                        Apr 11 '10 at 6:27







                        Minor nitpick: You don't need to use ptr_fun here, and if you do, you need to #include <functional>. (you probably shouldn't using namespace std either but I'm assuming this isn't for production code)

                        – Billy ONeal
                        Apr 11 '10 at 6:27















                        I omitted some trivial functionality, like the assignment operator, constructors, accessors and so on. The url class shouldn't have mutators. For the equality operator, you might add a hash member that you fill in while parsing the original string. Then, comparing two urls for equality should be very fast. It also means some extra complexity; it's your call.

                        – wilhelmtell
                        Apr 11 '10 at 7:07





                        I omitted some trivial functionality, like the assignment operator, constructors, accessors and so on. The url class shouldn't have mutators. For the equality operator, you might add a hash member that you fill in while parsing the original string. Then, comparing two urls for equality should be very fast. It also means some extra complexity; it's your call.

                        – wilhelmtell
                        Apr 11 '10 at 7:07




                        4




                        4





                        @Billy I always bring namespace std into my compilation units (not the headers!). I think it's perfectly fine, and I think that having std:: all over the place poses more pollution and eye-fatigue than bringing in the namespace.

                        – wilhelmtell
                        Apr 11 '10 at 7:12







                        @Billy I always bring namespace std into my compilation units (not the headers!). I think it's perfectly fine, and I think that having std:: all over the place poses more pollution and eye-fatigue than bringing in the namespace.

                        – wilhelmtell
                        Apr 11 '10 at 7:12






                        13




                        13





                        Funny how things are, on the very contrary I agree with Billy ONeal and remove all using namespace I came accross. If you really repeat a symbol, you can always have using std::string; but I prefer to have namespace qualification, makes it easier for poor old me to understand where that symbol came from.

                        – Matthieu M.
                        Apr 11 '10 at 11:45





                        Funny how things are, on the very contrary I agree with Billy ONeal and remove all using namespace I came accross. If you really repeat a symbol, you can always have using std::string; but I prefer to have namespace qualification, makes it easier for poor old me to understand where that symbol came from.

                        – Matthieu M.
                        Apr 11 '10 at 11:45




                        7




                        7





                        There are a lot of URI/URL forms not supported besides example.com:port/pathname. For instance http:/pathname and more importantly username:password@example.com/pathname#section - all the combinations are listed in ietf.org/rfc/rfc2396.txt - they show the following regex: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

                        – jdkoftinoff
                        Oct 18 '10 at 2:52







                        There are a lot of URI/URL forms not supported besides example.com:port/pathname. For instance http:/pathname and more importantly username:password@example.com/pathname#section - all the combinations are listed in ietf.org/rfc/rfc2396.txt - they show the following regex: ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?

                        – jdkoftinoff
                        Oct 18 '10 at 2:52













                        18














                        Wstring version of above, added other fields I needed. Could definitely be refined, but good enough for my purposes.



                        #include <string>
                        #include <algorithm> // find

                        struct Uri
                        {
                        public:
                        std::wstring QueryString, Path, Protocol, Host, Port;

                        static Uri Parse(const std::wstring &uri)
                        {
                        Uri result;

                        typedef std::wstring::const_iterator iterator_t;

                        if (uri.length() == 0)
                        return result;

                        iterator_t uriEnd = uri.end();

                        // get query start
                        iterator_t queryStart = std::find(uri.begin(), uriEnd, L'?');

                        // protocol
                        iterator_t protocolStart = uri.begin();
                        iterator_t protocolEnd = std::find(protocolStart, uriEnd, L':'); //"://");

                        if (protocolEnd != uriEnd)
                        {
                        std::wstring prot = &*(protocolEnd);
                        if ((prot.length() > 3) && (prot.substr(0, 3) == L"://"))
                        {
                        result.Protocol = std::wstring(protocolStart, protocolEnd);
                        protocolEnd += 3; // ://
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol

                        // host
                        iterator_t hostStart = protocolEnd;
                        iterator_t pathStart = std::find(hostStart, uriEnd, L'/'); // get pathStart

                        iterator_t hostEnd = std::find(protocolEnd,
                        (pathStart != uriEnd) ? pathStart : queryStart,
                        L':'); // check for port

                        result.Host = std::wstring(hostStart, hostEnd);

                        // port
                        if ((hostEnd != uriEnd) && ((&*(hostEnd))[0] == L':')) // we have a port
                        {
                        hostEnd++;
                        iterator_t portEnd = (pathStart != uriEnd) ? pathStart : queryStart;
                        result.Port = std::wstring(hostEnd, portEnd);
                        }

                        // path
                        if (pathStart != uriEnd)
                        result.Path = std::wstring(pathStart, queryStart);

                        // query
                        if (queryStart != uriEnd)
                        result.QueryString = std::wstring(queryStart, uri.end());

                        return result;

                        } // Parse
                        }; // uri


                        Tests/Usage



                        Uri u0 = Uri::Parse(L"http://localhost:80/foo.html?&q=1:2:3");
                        Uri u1 = Uri::Parse(L"https://localhost:80/foo.html?&q=1");
                        Uri u2 = Uri::Parse(L"localhost/foo");
                        Uri u3 = Uri::Parse(L"https://localhost/foo");
                        Uri u4 = Uri::Parse(L"localhost:8080");
                        Uri u5 = Uri::Parse(L"localhost?&foo=1");
                        Uri u6 = Uri::Parse(L"localhost?&foo=1:2:3");

                        u0.QueryString, u0.Path, u0.Protocol, u0.Host, u0.Port....





                        share|improve this answer


























                        • why use wstring?

                          – yeyimilk
                          Apr 19 '17 at 6:40











                        • @yeyimilk - It seemed like a good idea at the time!

                          – Tom
                          Apr 19 '17 at 16:35
















                        18














                        Wstring version of above, added other fields I needed. Could definitely be refined, but good enough for my purposes.



                        #include <string>
                        #include <algorithm> // find

                        struct Uri
                        {
                        public:
                        std::wstring QueryString, Path, Protocol, Host, Port;

                        static Uri Parse(const std::wstring &uri)
                        {
                        Uri result;

                        typedef std::wstring::const_iterator iterator_t;

                        if (uri.length() == 0)
                        return result;

                        iterator_t uriEnd = uri.end();

                        // get query start
                        iterator_t queryStart = std::find(uri.begin(), uriEnd, L'?');

                        // protocol
                        iterator_t protocolStart = uri.begin();
                        iterator_t protocolEnd = std::find(protocolStart, uriEnd, L':'); //"://");

                        if (protocolEnd != uriEnd)
                        {
                        std::wstring prot = &*(protocolEnd);
                        if ((prot.length() > 3) && (prot.substr(0, 3) == L"://"))
                        {
                        result.Protocol = std::wstring(protocolStart, protocolEnd);
                        protocolEnd += 3; // ://
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol

                        // host
                        iterator_t hostStart = protocolEnd;
                        iterator_t pathStart = std::find(hostStart, uriEnd, L'/'); // get pathStart

                        iterator_t hostEnd = std::find(protocolEnd,
                        (pathStart != uriEnd) ? pathStart : queryStart,
                        L':'); // check for port

                        result.Host = std::wstring(hostStart, hostEnd);

                        // port
                        if ((hostEnd != uriEnd) && ((&*(hostEnd))[0] == L':')) // we have a port
                        {
                        hostEnd++;
                        iterator_t portEnd = (pathStart != uriEnd) ? pathStart : queryStart;
                        result.Port = std::wstring(hostEnd, portEnd);
                        }

                        // path
                        if (pathStart != uriEnd)
                        result.Path = std::wstring(pathStart, queryStart);

                        // query
                        if (queryStart != uriEnd)
                        result.QueryString = std::wstring(queryStart, uri.end());

                        return result;

                        } // Parse
                        }; // uri


                        Tests/Usage



                        Uri u0 = Uri::Parse(L"http://localhost:80/foo.html?&q=1:2:3");
                        Uri u1 = Uri::Parse(L"https://localhost:80/foo.html?&q=1");
                        Uri u2 = Uri::Parse(L"localhost/foo");
                        Uri u3 = Uri::Parse(L"https://localhost/foo");
                        Uri u4 = Uri::Parse(L"localhost:8080");
                        Uri u5 = Uri::Parse(L"localhost?&foo=1");
                        Uri u6 = Uri::Parse(L"localhost?&foo=1:2:3");

                        u0.QueryString, u0.Path, u0.Protocol, u0.Host, u0.Port....





                        share|improve this answer


























                        • why use wstring?

                          – yeyimilk
                          Apr 19 '17 at 6:40











                        • @yeyimilk - It seemed like a good idea at the time!

                          – Tom
                          Apr 19 '17 at 16:35














                        18












                        18








                        18







                        Wstring version of above, added other fields I needed. Could definitely be refined, but good enough for my purposes.



                        #include <string>
                        #include <algorithm> // find

                        struct Uri
                        {
                        public:
                        std::wstring QueryString, Path, Protocol, Host, Port;

                        static Uri Parse(const std::wstring &uri)
                        {
                        Uri result;

                        typedef std::wstring::const_iterator iterator_t;

                        if (uri.length() == 0)
                        return result;

                        iterator_t uriEnd = uri.end();

                        // get query start
                        iterator_t queryStart = std::find(uri.begin(), uriEnd, L'?');

                        // protocol
                        iterator_t protocolStart = uri.begin();
                        iterator_t protocolEnd = std::find(protocolStart, uriEnd, L':'); //"://");

                        if (protocolEnd != uriEnd)
                        {
                        std::wstring prot = &*(protocolEnd);
                        if ((prot.length() > 3) && (prot.substr(0, 3) == L"://"))
                        {
                        result.Protocol = std::wstring(protocolStart, protocolEnd);
                        protocolEnd += 3; // ://
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol

                        // host
                        iterator_t hostStart = protocolEnd;
                        iterator_t pathStart = std::find(hostStart, uriEnd, L'/'); // get pathStart

                        iterator_t hostEnd = std::find(protocolEnd,
                        (pathStart != uriEnd) ? pathStart : queryStart,
                        L':'); // check for port

                        result.Host = std::wstring(hostStart, hostEnd);

                        // port
                        if ((hostEnd != uriEnd) && ((&*(hostEnd))[0] == L':')) // we have a port
                        {
                        hostEnd++;
                        iterator_t portEnd = (pathStart != uriEnd) ? pathStart : queryStart;
                        result.Port = std::wstring(hostEnd, portEnd);
                        }

                        // path
                        if (pathStart != uriEnd)
                        result.Path = std::wstring(pathStart, queryStart);

                        // query
                        if (queryStart != uriEnd)
                        result.QueryString = std::wstring(queryStart, uri.end());

                        return result;

                        } // Parse
                        }; // uri


                        Tests/Usage



                        Uri u0 = Uri::Parse(L"http://localhost:80/foo.html?&q=1:2:3");
                        Uri u1 = Uri::Parse(L"https://localhost:80/foo.html?&q=1");
                        Uri u2 = Uri::Parse(L"localhost/foo");
                        Uri u3 = Uri::Parse(L"https://localhost/foo");
                        Uri u4 = Uri::Parse(L"localhost:8080");
                        Uri u5 = Uri::Parse(L"localhost?&foo=1");
                        Uri u6 = Uri::Parse(L"localhost?&foo=1:2:3");

                        u0.QueryString, u0.Path, u0.Protocol, u0.Host, u0.Port....





                        share|improve this answer















                        Wstring version of above, added other fields I needed. Could definitely be refined, but good enough for my purposes.



                        #include <string>
                        #include <algorithm> // find

                        struct Uri
                        {
                        public:
                        std::wstring QueryString, Path, Protocol, Host, Port;

                        static Uri Parse(const std::wstring &uri)
                        {
                        Uri result;

                        typedef std::wstring::const_iterator iterator_t;

                        if (uri.length() == 0)
                        return result;

                        iterator_t uriEnd = uri.end();

                        // get query start
                        iterator_t queryStart = std::find(uri.begin(), uriEnd, L'?');

                        // protocol
                        iterator_t protocolStart = uri.begin();
                        iterator_t protocolEnd = std::find(protocolStart, uriEnd, L':'); //"://");

                        if (protocolEnd != uriEnd)
                        {
                        std::wstring prot = &*(protocolEnd);
                        if ((prot.length() > 3) && (prot.substr(0, 3) == L"://"))
                        {
                        result.Protocol = std::wstring(protocolStart, protocolEnd);
                        protocolEnd += 3; // ://
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol
                        }
                        else
                        protocolEnd = uri.begin(); // no protocol

                        // host
                        iterator_t hostStart = protocolEnd;
                        iterator_t pathStart = std::find(hostStart, uriEnd, L'/'); // get pathStart

                        iterator_t hostEnd = std::find(protocolEnd,
                        (pathStart != uriEnd) ? pathStart : queryStart,
                        L':'); // check for port

                        result.Host = std::wstring(hostStart, hostEnd);

                        // port
                        if ((hostEnd != uriEnd) && ((&*(hostEnd))[0] == L':')) // we have a port
                        {
                        hostEnd++;
                        iterator_t portEnd = (pathStart != uriEnd) ? pathStart : queryStart;
                        result.Port = std::wstring(hostEnd, portEnd);
                        }

                        // path
                        if (pathStart != uriEnd)
                        result.Path = std::wstring(pathStart, queryStart);

                        // query
                        if (queryStart != uriEnd)
                        result.QueryString = std::wstring(queryStart, uri.end());

                        return result;

                        } // Parse
                        }; // uri


                        Tests/Usage



                        Uri u0 = Uri::Parse(L"http://localhost:80/foo.html?&q=1:2:3");
                        Uri u1 = Uri::Parse(L"https://localhost:80/foo.html?&q=1");
                        Uri u2 = Uri::Parse(L"localhost/foo");
                        Uri u3 = Uri::Parse(L"https://localhost/foo");
                        Uri u4 = Uri::Parse(L"localhost:8080");
                        Uri u5 = Uri::Parse(L"localhost?&foo=1");
                        Uri u6 = Uri::Parse(L"localhost?&foo=1:2:3");

                        u0.QueryString, u0.Path, u0.Protocol, u0.Host, u0.Port....






                        share|improve this answer














                        share|improve this answer



                        share|improve this answer








                        edited Jun 15 '12 at 4:00

























                        answered Jun 15 '12 at 3:50









                        TomTom

                        1,4931618




                        1,4931618













                        • why use wstring?

                          – yeyimilk
                          Apr 19 '17 at 6:40











                        • @yeyimilk - It seemed like a good idea at the time!

                          – Tom
                          Apr 19 '17 at 16:35



















                        • why use wstring?

                          – yeyimilk
                          Apr 19 '17 at 6:40











                        • @yeyimilk - It seemed like a good idea at the time!

                          – Tom
                          Apr 19 '17 at 16:35

















                        why use wstring?

                        – yeyimilk
                        Apr 19 '17 at 6:40





                        why use wstring?

                        – yeyimilk
                        Apr 19 '17 at 6:40













                        @yeyimilk - It seemed like a good idea at the time!

                        – Tom
                        Apr 19 '17 at 16:35





                        @yeyimilk - It seemed like a good idea at the time!

                        – Tom
                        Apr 19 '17 at 16:35











                        11














                        For completeness, there is one written in C that you could use (with a little wrapping, no doubt): http://uriparser.sourceforge.net/



                        [RFC-compliant and supports Unicode]





                        Here's a very basic wrapper I've been using for simply grabbing the results of a parse.



                        #include <string>
                        #include <uriparser/Uri.h>


                        namespace uriparser
                        {
                        class Uri //: boost::noncopyable
                        {
                        public:
                        Uri(std::string uri)
                        : uri_(uri)
                        {
                        UriParserStateA state_;
                        state_.uri = &uriParse_;
                        isValid_ = uriParseUriA(&state_, uri_.c_str()) == URI_SUCCESS;
                        }

                        ~Uri() { uriFreeUriMembersA(&uriParse_); }

                        bool isValid() const { return isValid_; }

                        std::string scheme() const { return fromRange(uriParse_.scheme); }
                        std::string host() const { return fromRange(uriParse_.hostText); }
                        std::string port() const { return fromRange(uriParse_.portText); }
                        std::string path() const { return fromList(uriParse_.pathHead, "/"); }
                        std::string query() const { return fromRange(uriParse_.query); }
                        std::string fragment() const { return fromRange(uriParse_.fragment); }

                        private:
                        std::string uri_;
                        UriUriA uriParse_;
                        bool isValid_;

                        std::string fromRange(const UriTextRangeA & rng) const
                        {
                        return std::string(rng.first, rng.afterLast);
                        }

                        std::string fromList(UriPathSegmentA * xs, const std::string & delim) const
                        {
                        UriPathSegmentStructA * head(xs);
                        std::string accum;

                        while (head)
                        {
                        accum += delim + fromRange(head->text);
                        head = head->next;
                        }

                        return accum;
                        }
                        };
                        }





                        share|improve this answer





















                        • 3





                          +1, I ended up cloning your URL parser lib off github. Much nicer not having to pull in all of boost...

                          – Alan
                          Oct 21 '13 at 3:43











                        • @Alan I don't know of a URL parser in Boost. cpp-netlib has one, but I've had issues with it (very possibly fixed by now) so I use this one instead.

                          – Elliot Cameron
                          Apr 15 '15 at 17:36
















                        11














                        For completeness, there is one written in C that you could use (with a little wrapping, no doubt): http://uriparser.sourceforge.net/



                        [RFC-compliant and supports Unicode]





                        Here's a very basic wrapper I've been using for simply grabbing the results of a parse.



                        #include <string>
                        #include <uriparser/Uri.h>


                        namespace uriparser
                        {
                        class Uri //: boost::noncopyable
                        {
                        public:
                        Uri(std::string uri)
                        : uri_(uri)
                        {
                        UriParserStateA state_;
                        state_.uri = &uriParse_;
                        isValid_ = uriParseUriA(&state_, uri_.c_str()) == URI_SUCCESS;
                        }

                        ~Uri() { uriFreeUriMembersA(&uriParse_); }

                        bool isValid() const { return isValid_; }

                        std::string scheme() const { return fromRange(uriParse_.scheme); }
                        std::string host() const { return fromRange(uriParse_.hostText); }
                        std::string port() const { return fromRange(uriParse_.portText); }
                        std::string path() const { return fromList(uriParse_.pathHead, "/"); }
                        std::string query() const { return fromRange(uriParse_.query); }
                        std::string fragment() const { return fromRange(uriParse_.fragment); }

                        private:
                        std::string uri_;
                        UriUriA uriParse_;
                        bool isValid_;

                        std::string fromRange(const UriTextRangeA & rng) const
                        {
                        return std::string(rng.first, rng.afterLast);
                        }

                        std::string fromList(UriPathSegmentA * xs, const std::string & delim) const
                        {
                        UriPathSegmentStructA * head(xs);
                        std::string accum;

                        while (head)
                        {
                        accum += delim + fromRange(head->text);
                        head = head->next;
                        }

                        return accum;
                        }
                        };
                        }





                        share|improve this answer





















                        • 3





                          +1, I ended up cloning your URL parser lib off github. Much nicer not having to pull in all of boost...

                          – Alan
                          Oct 21 '13 at 3:43











                        • @Alan I don't know of a URL parser in Boost. cpp-netlib has one, but I've had issues with it (very possibly fixed by now) so I use this one instead.

                          – Elliot Cameron
                          Apr 15 '15 at 17:36














                        11












                        11








                        11







                        For completeness, there is one written in C that you could use (with a little wrapping, no doubt): http://uriparser.sourceforge.net/



                        [RFC-compliant and supports Unicode]





                        Here's a very basic wrapper I've been using for simply grabbing the results of a parse.



                        #include <string>
                        #include <uriparser/Uri.h>


                        namespace uriparser
                        {
                        class Uri //: boost::noncopyable
                        {
                        public:
                        Uri(std::string uri)
                        : uri_(uri)
                        {
                        UriParserStateA state_;
                        state_.uri = &uriParse_;
                        isValid_ = uriParseUriA(&state_, uri_.c_str()) == URI_SUCCESS;
                        }

                        ~Uri() { uriFreeUriMembersA(&uriParse_); }

                        bool isValid() const { return isValid_; }

                        std::string scheme() const { return fromRange(uriParse_.scheme); }
                        std::string host() const { return fromRange(uriParse_.hostText); }
                        std::string port() const { return fromRange(uriParse_.portText); }
                        std::string path() const { return fromList(uriParse_.pathHead, "/"); }
                        std::string query() const { return fromRange(uriParse_.query); }
                        std::string fragment() const { return fromRange(uriParse_.fragment); }

                        private:
                        std::string uri_;
                        UriUriA uriParse_;
                        bool isValid_;

                        std::string fromRange(const UriTextRangeA & rng) const
                        {
                        return std::string(rng.first, rng.afterLast);
                        }

                        std::string fromList(UriPathSegmentA * xs, const std::string & delim) const
                        {
                        UriPathSegmentStructA * head(xs);
                        std::string accum;

                        while (head)
                        {
                        accum += delim + fromRange(head->text);
                        head = head->next;
                        }

                        return accum;
                        }
                        };
                        }





                        share|improve this answer















                        For completeness, there is one written in C that you could use (with a little wrapping, no doubt): http://uriparser.sourceforge.net/



                        [RFC-compliant and supports Unicode]





                        Here's a very basic wrapper I've been using for simply grabbing the results of a parse.



                        #include <string>
                        #include <uriparser/Uri.h>


                        namespace uriparser
                        {
                        class Uri //: boost::noncopyable
                        {
                        public:
                        Uri(std::string uri)
                        : uri_(uri)
                        {
                        UriParserStateA state_;
                        state_.uri = &uriParse_;
                        isValid_ = uriParseUriA(&state_, uri_.c_str()) == URI_SUCCESS;
                        }

                        ~Uri() { uriFreeUriMembersA(&uriParse_); }

                        bool isValid() const { return isValid_; }

                        std::string scheme() const { return fromRange(uriParse_.scheme); }
                        std::string host() const { return fromRange(uriParse_.hostText); }
                        std::string port() const { return fromRange(uriParse_.portText); }
                        std::string path() const { return fromList(uriParse_.pathHead, "/"); }
                        std::string query() const { return fromRange(uriParse_.query); }
                        std::string fragment() const { return fromRange(uriParse_.fragment); }

                        private:
                        std::string uri_;
                        UriUriA uriParse_;
                        bool isValid_;

                        std::string fromRange(const UriTextRangeA & rng) const
                        {
                        return std::string(rng.first, rng.afterLast);
                        }

                        std::string fromList(UriPathSegmentA * xs, const std::string & delim) const
                        {
                        UriPathSegmentStructA * head(xs);
                        std::string accum;

                        while (head)
                        {
                        accum += delim + fromRange(head->text);
                        head = head->next;
                        }

                        return accum;
                        }
                        };
                        }






                        share|improve this answer














                        share|improve this answer



                        share|improve this answer








                        edited Aug 12 '14 at 1:19

























                        answered Jun 14 '12 at 20:33









                        Elliot CameronElliot Cameron

                        3,96122127




                        3,96122127








                        • 3





                          +1, I ended up cloning your URL parser lib off github. Much nicer not having to pull in all of boost...

                          – Alan
                          Oct 21 '13 at 3:43











                        • @Alan I don't know of a URL parser in Boost. cpp-netlib has one, but I've had issues with it (very possibly fixed by now) so I use this one instead.

                          – Elliot Cameron
                          Apr 15 '15 at 17:36














                        • 3





                          +1, I ended up cloning your URL parser lib off github. Much nicer not having to pull in all of boost...

                          – Alan
                          Oct 21 '13 at 3:43











                        • @Alan I don't know of a URL parser in Boost. cpp-netlib has one, but I've had issues with it (very possibly fixed by now) so I use this one instead.

                          – Elliot Cameron
                          Apr 15 '15 at 17:36








                        3




                        3





                        +1, I ended up cloning your URL parser lib off github. Much nicer not having to pull in all of boost...

                        – Alan
                        Oct 21 '13 at 3:43





                        +1, I ended up cloning your URL parser lib off github. Much nicer not having to pull in all of boost...

                        – Alan
                        Oct 21 '13 at 3:43













                        @Alan I don't know of a URL parser in Boost. cpp-netlib has one, but I've had issues with it (very possibly fixed by now) so I use this one instead.

                        – Elliot Cameron
                        Apr 15 '15 at 17:36





                        @Alan I don't know of a URL parser in Boost. cpp-netlib has one, but I've had issues with it (very possibly fixed by now) so I use this one instead.

                        – Elliot Cameron
                        Apr 15 '15 at 17:36











                        6














                        POCO's URI class can parse URLs for you. The following example is shortened version of the one in POCO URI and UUID slides:



                        #include "Poco/URI.h"
                        #include <iostream>

                        int main(int argc, char** argv)
                        {
                        Poco::URI uri1("http://www.appinf.com:88/sample?example-query#frag");

                        std::string scheme(uri1.getScheme()); // "http"
                        std::string auth(uri1.getAuthority()); // "www.appinf.com:88"
                        std::string host(uri1.getHost()); // "www.appinf.com"
                        unsigned short port = uri1.getPort(); // 88
                        std::string path(uri1.getPath()); // "/sample"
                        std::string query(uri1.getQuery()); // "example-query"
                        std::string frag(uri1.getFragment()); // "frag"
                        std::string pathEtc(uri1.getPathEtc()); // "/sample?example-query#frag"

                        return 0;
                        }





                        share|improve this answer




























                          6














                          POCO's URI class can parse URLs for you. The following example is shortened version of the one in POCO URI and UUID slides:



                          #include "Poco/URI.h"
                          #include <iostream>

                          int main(int argc, char** argv)
                          {
                          Poco::URI uri1("http://www.appinf.com:88/sample?example-query#frag");

                          std::string scheme(uri1.getScheme()); // "http"
                          std::string auth(uri1.getAuthority()); // "www.appinf.com:88"
                          std::string host(uri1.getHost()); // "www.appinf.com"
                          unsigned short port = uri1.getPort(); // 88
                          std::string path(uri1.getPath()); // "/sample"
                          std::string query(uri1.getQuery()); // "example-query"
                          std::string frag(uri1.getFragment()); // "frag"
                          std::string pathEtc(uri1.getPathEtc()); // "/sample?example-query#frag"

                          return 0;
                          }





                          share|improve this answer


























                            6












                            6








                            6







                            POCO's URI class can parse URLs for you. The following example is shortened version of the one in POCO URI and UUID slides:



                            #include "Poco/URI.h"
                            #include <iostream>

                            int main(int argc, char** argv)
                            {
                            Poco::URI uri1("http://www.appinf.com:88/sample?example-query#frag");

                            std::string scheme(uri1.getScheme()); // "http"
                            std::string auth(uri1.getAuthority()); // "www.appinf.com:88"
                            std::string host(uri1.getHost()); // "www.appinf.com"
                            unsigned short port = uri1.getPort(); // 88
                            std::string path(uri1.getPath()); // "/sample"
                            std::string query(uri1.getQuery()); // "example-query"
                            std::string frag(uri1.getFragment()); // "frag"
                            std::string pathEtc(uri1.getPathEtc()); // "/sample?example-query#frag"

                            return 0;
                            }





                            share|improve this answer













                            POCO's URI class can parse URLs for you. The following example is shortened version of the one in POCO URI and UUID slides:



                            #include "Poco/URI.h"
                            #include <iostream>

                            int main(int argc, char** argv)
                            {
                            Poco::URI uri1("http://www.appinf.com:88/sample?example-query#frag");

                            std::string scheme(uri1.getScheme()); // "http"
                            std::string auth(uri1.getAuthority()); // "www.appinf.com:88"
                            std::string host(uri1.getHost()); // "www.appinf.com"
                            unsigned short port = uri1.getPort(); // 88
                            std::string path(uri1.getPath()); // "/sample"
                            std::string query(uri1.getQuery()); // "example-query"
                            std::string frag(uri1.getFragment()); // "frag"
                            std::string pathEtc(uri1.getPathEtc()); // "/sample?example-query#frag"

                            return 0;
                            }






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Aug 16 '13 at 20:09









                            Michael Mc DonnellMichael Mc Donnell

                            13712




                            13712























                                5














                                The Poco library now has a class for dissecting URI's and feeding back the host, path segments and query string etc.



                                https://pocoproject.org/pro/docs/Poco.URI.html






                                share|improve this answer






























                                  5














                                  The Poco library now has a class for dissecting URI's and feeding back the host, path segments and query string etc.



                                  https://pocoproject.org/pro/docs/Poco.URI.html






                                  share|improve this answer




























                                    5












                                    5








                                    5







                                    The Poco library now has a class for dissecting URI's and feeding back the host, path segments and query string etc.



                                    https://pocoproject.org/pro/docs/Poco.URI.html






                                    share|improve this answer















                                    The Poco library now has a class for dissecting URI's and feeding back the host, path segments and query string etc.



                                    https://pocoproject.org/pro/docs/Poco.URI.html







                                    share|improve this answer














                                    share|improve this answer



                                    share|improve this answer








                                    edited Dec 14 '18 at 20:44









                                    yan

                                    8391820




                                    8391820










                                    answered Sep 1 '11 at 7:44









                                    Tom MakinTom Makin

                                    5111




                                    5111























                                        4














                                        //sudo apt-get install libboost-all-dev; #install boost
                                        //g++ urlregex.cpp -lboost_regex; #compile
                                        #include <string>
                                        #include <iostream>
                                        #include <boost/regex.hpp>

                                        using namespace std;

                                        int main(int argc, char* argv)
                                        {
                                        string url="https://www.google.com:443/webhp?gws_rd=ssl#q=cpp";
                                        boost::regex ex("(http|https)://([^/ :]+):?([^/ ]*)(/?[^ #?]*)\x3f?([^ #]*)#?([^ ]*)");
                                        boost::cmatch what;
                                        if(regex_match(url.c_str(), what, ex))
                                        {
                                        cout << "protocol: " << string(what[1].first, what[1].second) << endl;
                                        cout << "domain: " << string(what[2].first, what[2].second) << endl;
                                        cout << "port: " << string(what[3].first, what[3].second) << endl;
                                        cout << "path: " << string(what[4].first, what[4].second) << endl;
                                        cout << "query: " << string(what[5].first, what[5].second) << endl;
                                        cout << "fragment: " << string(what[6].first, what[6].second) << endl;
                                        }
                                        return 0;
                                        }





                                        share|improve this answer


























                                        • it doesn't work

                                          – asit_dhal
                                          Jan 4 '15 at 3:04











                                        • I just tried it with a number of different URLs and it works very well.

                                          – Caroline Beltran
                                          Feb 9 '18 at 19:01
















                                        4














                                        //sudo apt-get install libboost-all-dev; #install boost
                                        //g++ urlregex.cpp -lboost_regex; #compile
                                        #include <string>
                                        #include <iostream>
                                        #include <boost/regex.hpp>

                                        using namespace std;

                                        int main(int argc, char* argv)
                                        {
                                        string url="https://www.google.com:443/webhp?gws_rd=ssl#q=cpp";
                                        boost::regex ex("(http|https)://([^/ :]+):?([^/ ]*)(/?[^ #?]*)\x3f?([^ #]*)#?([^ ]*)");
                                        boost::cmatch what;
                                        if(regex_match(url.c_str(), what, ex))
                                        {
                                        cout << "protocol: " << string(what[1].first, what[1].second) << endl;
                                        cout << "domain: " << string(what[2].first, what[2].second) << endl;
                                        cout << "port: " << string(what[3].first, what[3].second) << endl;
                                        cout << "path: " << string(what[4].first, what[4].second) << endl;
                                        cout << "query: " << string(what[5].first, what[5].second) << endl;
                                        cout << "fragment: " << string(what[6].first, what[6].second) << endl;
                                        }
                                        return 0;
                                        }





                                        share|improve this answer


























                                        • it doesn't work

                                          – asit_dhal
                                          Jan 4 '15 at 3:04











                                        • I just tried it with a number of different URLs and it works very well.

                                          – Caroline Beltran
                                          Feb 9 '18 at 19:01














                                        4












                                        4








                                        4







                                        //sudo apt-get install libboost-all-dev; #install boost
                                        //g++ urlregex.cpp -lboost_regex; #compile
                                        #include <string>
                                        #include <iostream>
                                        #include <boost/regex.hpp>

                                        using namespace std;

                                        int main(int argc, char* argv)
                                        {
                                        string url="https://www.google.com:443/webhp?gws_rd=ssl#q=cpp";
                                        boost::regex ex("(http|https)://([^/ :]+):?([^/ ]*)(/?[^ #?]*)\x3f?([^ #]*)#?([^ ]*)");
                                        boost::cmatch what;
                                        if(regex_match(url.c_str(), what, ex))
                                        {
                                        cout << "protocol: " << string(what[1].first, what[1].second) << endl;
                                        cout << "domain: " << string(what[2].first, what[2].second) << endl;
                                        cout << "port: " << string(what[3].first, what[3].second) << endl;
                                        cout << "path: " << string(what[4].first, what[4].second) << endl;
                                        cout << "query: " << string(what[5].first, what[5].second) << endl;
                                        cout << "fragment: " << string(what[6].first, what[6].second) << endl;
                                        }
                                        return 0;
                                        }





                                        share|improve this answer















                                        //sudo apt-get install libboost-all-dev; #install boost
                                        //g++ urlregex.cpp -lboost_regex; #compile
                                        #include <string>
                                        #include <iostream>
                                        #include <boost/regex.hpp>

                                        using namespace std;

                                        int main(int argc, char* argv)
                                        {
                                        string url="https://www.google.com:443/webhp?gws_rd=ssl#q=cpp";
                                        boost::regex ex("(http|https)://([^/ :]+):?([^/ ]*)(/?[^ #?]*)\x3f?([^ #]*)#?([^ ]*)");
                                        boost::cmatch what;
                                        if(regex_match(url.c_str(), what, ex))
                                        {
                                        cout << "protocol: " << string(what[1].first, what[1].second) << endl;
                                        cout << "domain: " << string(what[2].first, what[2].second) << endl;
                                        cout << "port: " << string(what[3].first, what[3].second) << endl;
                                        cout << "path: " << string(what[4].first, what[4].second) << endl;
                                        cout << "query: " << string(what[5].first, what[5].second) << endl;
                                        cout << "fragment: " << string(what[6].first, what[6].second) << endl;
                                        }
                                        return 0;
                                        }






                                        share|improve this answer














                                        share|improve this answer



                                        share|improve this answer








                                        edited Jan 7 '15 at 23:56

























                                        answered Dec 9 '14 at 6:34









                                        velcrowvelcrow

                                        5,22842221




                                        5,22842221













                                        • it doesn't work

                                          – asit_dhal
                                          Jan 4 '15 at 3:04











                                        • I just tried it with a number of different URLs and it works very well.

                                          – Caroline Beltran
                                          Feb 9 '18 at 19:01



















                                        • it doesn't work

                                          – asit_dhal
                                          Jan 4 '15 at 3:04











                                        • I just tried it with a number of different URLs and it works very well.

                                          – Caroline Beltran
                                          Feb 9 '18 at 19:01

















                                        it doesn't work

                                        – asit_dhal
                                        Jan 4 '15 at 3:04





                                        it doesn't work

                                        – asit_dhal
                                        Jan 4 '15 at 3:04













                                        I just tried it with a number of different URLs and it works very well.

                                        – Caroline Beltran
                                        Feb 9 '18 at 19:01





                                        I just tried it with a number of different URLs and it works very well.

                                        – Caroline Beltran
                                        Feb 9 '18 at 19:01











                                        4














                                        Facebook's Folly library can do the job for you easily. Simply use the Uri class:



                                        #include <folly/Uri.h>

                                        int main() {
                                        folly::Uri folly("https://code.facebook.com/posts/177011135812493/");

                                        folly.scheme(); // https
                                        folly.host(); // code.facebook.com
                                        folly.path(); // posts/177011135812493/
                                        }





                                        share|improve this answer




























                                          4














                                          Facebook's Folly library can do the job for you easily. Simply use the Uri class:



                                          #include <folly/Uri.h>

                                          int main() {
                                          folly::Uri folly("https://code.facebook.com/posts/177011135812493/");

                                          folly.scheme(); // https
                                          folly.host(); // code.facebook.com
                                          folly.path(); // posts/177011135812493/
                                          }





                                          share|improve this answer


























                                            4












                                            4








                                            4







                                            Facebook's Folly library can do the job for you easily. Simply use the Uri class:



                                            #include <folly/Uri.h>

                                            int main() {
                                            folly::Uri folly("https://code.facebook.com/posts/177011135812493/");

                                            folly.scheme(); // https
                                            folly.host(); // code.facebook.com
                                            folly.path(); // posts/177011135812493/
                                            }





                                            share|improve this answer













                                            Facebook's Folly library can do the job for you easily. Simply use the Uri class:



                                            #include <folly/Uri.h>

                                            int main() {
                                            folly::Uri folly("https://code.facebook.com/posts/177011135812493/");

                                            folly.scheme(); // https
                                            folly.host(); // code.facebook.com
                                            folly.path(); // posts/177011135812493/
                                            }






                                            share|improve this answer












                                            share|improve this answer



                                            share|improve this answer










                                            answered May 21 '15 at 23:41









                                            SunSun

                                            26028




                                            26028























                                                2














                                                Also of interest could be http://code.google.com/p/uri-grammar/ which like Dean Michael's netlib uses boost spirit to parse a URI. Came across it at Simple expression parser example using Boost::Spirit?






                                                share|improve this answer






























                                                  2














                                                  Also of interest could be http://code.google.com/p/uri-grammar/ which like Dean Michael's netlib uses boost spirit to parse a URI. Came across it at Simple expression parser example using Boost::Spirit?






                                                  share|improve this answer




























                                                    2












                                                    2








                                                    2







                                                    Also of interest could be http://code.google.com/p/uri-grammar/ which like Dean Michael's netlib uses boost spirit to parse a URI. Came across it at Simple expression parser example using Boost::Spirit?






                                                    share|improve this answer















                                                    Also of interest could be http://code.google.com/p/uri-grammar/ which like Dean Michael's netlib uses boost spirit to parse a URI. Came across it at Simple expression parser example using Boost::Spirit?







                                                    share|improve this answer














                                                    share|improve this answer



                                                    share|improve this answer








                                                    edited May 23 '17 at 12:26









                                                    Community

                                                    11




                                                    11










                                                    answered Nov 18 '10 at 15:47









                                                    RalfRalf

                                                    8,21522042




                                                    8,21522042























                                                        1














                                                        QT has QUrl for this. GNOME has SoupURI in libsoup, which you'll probably find a little more light-weight.






                                                        share|improve this answer






























                                                          1














                                                          QT has QUrl for this. GNOME has SoupURI in libsoup, which you'll probably find a little more light-weight.






                                                          share|improve this answer




























                                                            1












                                                            1








                                                            1







                                                            QT has QUrl for this. GNOME has SoupURI in libsoup, which you'll probably find a little more light-weight.






                                                            share|improve this answer















                                                            QT has QUrl for this. GNOME has SoupURI in libsoup, which you'll probably find a little more light-weight.







                                                            share|improve this answer














                                                            share|improve this answer



                                                            share|improve this answer








                                                            edited Apr 11 '10 at 4:34

























                                                            answered Apr 11 '10 at 4:23









                                                            Matthew FlaschenMatthew Flaschen

                                                            222k37444503




                                                            222k37444503























                                                                1














                                                                There is the newly released google-url lib:



                                                                http://code.google.com/p/google-url/



                                                                The library provides a low-level url parsing API as well as a higher-level abstraction called GURL. Here's an example using that:



                                                                #include <googleurlsrcgurl.h>

                                                                wchar_t url = L"http://www.facebook.com";
                                                                GURL parsedUrl (url);
                                                                assert(parsedUrl.DomainIs("facebook.com"));


                                                                Two small complaints I have with it: (1) it wants to use ICU by default to deal with different string encodings and (2) it makes some assumptions about logging (but I think they can be disabled). In other words, the library is not completely stand-alone as it exists, but I think it's still a good basis to start with, especially if you are already using ICU.






                                                                share|improve this answer


























                                                                • its merged with chromium source and no longer maintained separately

                                                                  – Silver Moon
                                                                  May 13 '15 at 5:33
















                                                                1














                                                                There is the newly released google-url lib:



                                                                http://code.google.com/p/google-url/



                                                                The library provides a low-level url parsing API as well as a higher-level abstraction called GURL. Here's an example using that:



                                                                #include <googleurlsrcgurl.h>

                                                                wchar_t url = L"http://www.facebook.com";
                                                                GURL parsedUrl (url);
                                                                assert(parsedUrl.DomainIs("facebook.com"));


                                                                Two small complaints I have with it: (1) it wants to use ICU by default to deal with different string encodings and (2) it makes some assumptions about logging (but I think they can be disabled). In other words, the library is not completely stand-alone as it exists, but I think it's still a good basis to start with, especially if you are already using ICU.






                                                                share|improve this answer


























                                                                • its merged with chromium source and no longer maintained separately

                                                                  – Silver Moon
                                                                  May 13 '15 at 5:33














                                                                1












                                                                1








                                                                1







                                                                There is the newly released google-url lib:



                                                                http://code.google.com/p/google-url/



                                                                The library provides a low-level url parsing API as well as a higher-level abstraction called GURL. Here's an example using that:



                                                                #include <googleurlsrcgurl.h>

                                                                wchar_t url = L"http://www.facebook.com";
                                                                GURL parsedUrl (url);
                                                                assert(parsedUrl.DomainIs("facebook.com"));


                                                                Two small complaints I have with it: (1) it wants to use ICU by default to deal with different string encodings and (2) it makes some assumptions about logging (but I think they can be disabled). In other words, the library is not completely stand-alone as it exists, but I think it's still a good basis to start with, especially if you are already using ICU.






                                                                share|improve this answer















                                                                There is the newly released google-url lib:



                                                                http://code.google.com/p/google-url/



                                                                The library provides a low-level url parsing API as well as a higher-level abstraction called GURL. Here's an example using that:



                                                                #include <googleurlsrcgurl.h>

                                                                wchar_t url = L"http://www.facebook.com";
                                                                GURL parsedUrl (url);
                                                                assert(parsedUrl.DomainIs("facebook.com"));


                                                                Two small complaints I have with it: (1) it wants to use ICU by default to deal with different string encodings and (2) it makes some assumptions about logging (but I think they can be disabled). In other words, the library is not completely stand-alone as it exists, but I think it's still a good basis to start with, especially if you are already using ICU.







                                                                share|improve this answer














                                                                share|improve this answer



                                                                share|improve this answer








                                                                edited Mar 23 '11 at 17:18

























                                                                answered Jan 5 '11 at 22:37









                                                                Mike ElleryMike Ellery

                                                                1,48211526




                                                                1,48211526













                                                                • its merged with chromium source and no longer maintained separately

                                                                  – Silver Moon
                                                                  May 13 '15 at 5:33



















                                                                • its merged with chromium source and no longer maintained separately

                                                                  – Silver Moon
                                                                  May 13 '15 at 5:33

















                                                                its merged with chromium source and no longer maintained separately

                                                                – Silver Moon
                                                                May 13 '15 at 5:33





                                                                its merged with chromium source and no longer maintained separately

                                                                – Silver Moon
                                                                May 13 '15 at 5:33











                                                                1














                                                                This library is very tiny and lightweight: https://github.com/corporateshark/LUrlParser



                                                                However, it is parsing only, no URL normalization/validation.






                                                                share|improve this answer




























                                                                  1














                                                                  This library is very tiny and lightweight: https://github.com/corporateshark/LUrlParser



                                                                  However, it is parsing only, no URL normalization/validation.






                                                                  share|improve this answer


























                                                                    1












                                                                    1








                                                                    1







                                                                    This library is very tiny and lightweight: https://github.com/corporateshark/LUrlParser



                                                                    However, it is parsing only, no URL normalization/validation.






                                                                    share|improve this answer













                                                                    This library is very tiny and lightweight: https://github.com/corporateshark/LUrlParser



                                                                    However, it is parsing only, no URL normalization/validation.







                                                                    share|improve this answer












                                                                    share|improve this answer



                                                                    share|improve this answer










                                                                    answered Feb 4 '15 at 16:29









                                                                    Sergey K.Sergey K.

                                                                    20.8k1384161




                                                                    20.8k1384161























                                                                        1














                                                                        You could try the open-source library called C++ REST SDK (created by Microsoft, distributed under the Apache License 2.0). It can be built for several platforms including Windows, Linux, OSX, iOS, Android). There is a class called web::uri where you put in a string and can retrieve individual URL components. Here is a code sample (tested on Windows):



                                                                        #include <cpprest/base_uri.h>
                                                                        #include <iostream>
                                                                        #include <ostream>

                                                                        web::uri sample_uri( L"http://dummyuser@localhost:7777/dummypath?dummyquery#dummyfragment" );
                                                                        std::wcout << L"scheme: " << sample_uri.scheme() << std::endl;
                                                                        std::wcout << L"user: " << sample_uri.user_info() << std::endl;
                                                                        std::wcout << L"host: " << sample_uri.host() << std::endl;
                                                                        std::wcout << L"port: " << sample_uri.port() << std::endl;
                                                                        std::wcout << L"path: " << sample_uri.path() << std::endl;
                                                                        std::wcout << L"query: " << sample_uri.query() << std::endl;
                                                                        std::wcout << L"fragment: " << sample_uri.fragment() << std::endl;


                                                                        The output will be:



                                                                        scheme: http
                                                                        user: dummyuser
                                                                        host: localhost
                                                                        port: 7777
                                                                        path: /dummypath
                                                                        query: dummyquery
                                                                        fragment: dummyfragment


                                                                        There are also other easy-to-use methods, e.g. to access individual attribute/value pairs from the query, split the path into components, etc.






                                                                        share|improve this answer






























                                                                          1














                                                                          You could try the open-source library called C++ REST SDK (created by Microsoft, distributed under the Apache License 2.0). It can be built for several platforms including Windows, Linux, OSX, iOS, Android). There is a class called web::uri where you put in a string and can retrieve individual URL components. Here is a code sample (tested on Windows):



                                                                          #include <cpprest/base_uri.h>
                                                                          #include <iostream>
                                                                          #include <ostream>

                                                                          web::uri sample_uri( L"http://dummyuser@localhost:7777/dummypath?dummyquery#dummyfragment" );
                                                                          std::wcout << L"scheme: " << sample_uri.scheme() << std::endl;
                                                                          std::wcout << L"user: " << sample_uri.user_info() << std::endl;
                                                                          std::wcout << L"host: " << sample_uri.host() << std::endl;
                                                                          std::wcout << L"port: " << sample_uri.port() << std::endl;
                                                                          std::wcout << L"path: " << sample_uri.path() << std::endl;
                                                                          std::wcout << L"query: " << sample_uri.query() << std::endl;
                                                                          std::wcout << L"fragment: " << sample_uri.fragment() << std::endl;


                                                                          The output will be:



                                                                          scheme: http
                                                                          user: dummyuser
                                                                          host: localhost
                                                                          port: 7777
                                                                          path: /dummypath
                                                                          query: dummyquery
                                                                          fragment: dummyfragment


                                                                          There are also other easy-to-use methods, e.g. to access individual attribute/value pairs from the query, split the path into components, etc.






                                                                          share|improve this answer




























                                                                            1












                                                                            1








                                                                            1







                                                                            You could try the open-source library called C++ REST SDK (created by Microsoft, distributed under the Apache License 2.0). It can be built for several platforms including Windows, Linux, OSX, iOS, Android). There is a class called web::uri where you put in a string and can retrieve individual URL components. Here is a code sample (tested on Windows):



                                                                            #include <cpprest/base_uri.h>
                                                                            #include <iostream>
                                                                            #include <ostream>

                                                                            web::uri sample_uri( L"http://dummyuser@localhost:7777/dummypath?dummyquery#dummyfragment" );
                                                                            std::wcout << L"scheme: " << sample_uri.scheme() << std::endl;
                                                                            std::wcout << L"user: " << sample_uri.user_info() << std::endl;
                                                                            std::wcout << L"host: " << sample_uri.host() << std::endl;
                                                                            std::wcout << L"port: " << sample_uri.port() << std::endl;
                                                                            std::wcout << L"path: " << sample_uri.path() << std::endl;
                                                                            std::wcout << L"query: " << sample_uri.query() << std::endl;
                                                                            std::wcout << L"fragment: " << sample_uri.fragment() << std::endl;


                                                                            The output will be:



                                                                            scheme: http
                                                                            user: dummyuser
                                                                            host: localhost
                                                                            port: 7777
                                                                            path: /dummypath
                                                                            query: dummyquery
                                                                            fragment: dummyfragment


                                                                            There are also other easy-to-use methods, e.g. to access individual attribute/value pairs from the query, split the path into components, etc.






                                                                            share|improve this answer















                                                                            You could try the open-source library called C++ REST SDK (created by Microsoft, distributed under the Apache License 2.0). It can be built for several platforms including Windows, Linux, OSX, iOS, Android). There is a class called web::uri where you put in a string and can retrieve individual URL components. Here is a code sample (tested on Windows):



                                                                            #include <cpprest/base_uri.h>
                                                                            #include <iostream>
                                                                            #include <ostream>

                                                                            web::uri sample_uri( L"http://dummyuser@localhost:7777/dummypath?dummyquery#dummyfragment" );
                                                                            std::wcout << L"scheme: " << sample_uri.scheme() << std::endl;
                                                                            std::wcout << L"user: " << sample_uri.user_info() << std::endl;
                                                                            std::wcout << L"host: " << sample_uri.host() << std::endl;
                                                                            std::wcout << L"port: " << sample_uri.port() << std::endl;
                                                                            std::wcout << L"path: " << sample_uri.path() << std::endl;
                                                                            std::wcout << L"query: " << sample_uri.query() << std::endl;
                                                                            std::wcout << L"fragment: " << sample_uri.fragment() << std::endl;


                                                                            The output will be:



                                                                            scheme: http
                                                                            user: dummyuser
                                                                            host: localhost
                                                                            port: 7777
                                                                            path: /dummypath
                                                                            query: dummyquery
                                                                            fragment: dummyfragment


                                                                            There are also other easy-to-use methods, e.g. to access individual attribute/value pairs from the query, split the path into components, etc.







                                                                            share|improve this answer














                                                                            share|improve this answer



                                                                            share|improve this answer








                                                                            edited Sep 30 '16 at 16:10

























                                                                            answered Sep 30 '16 at 15:42









                                                                            VivitVivit

                                                                            1,07911835




                                                                            1,07911835























                                                                                1














                                                                                May I offer another self-contained solution based on std::regex :



                                                                                const char* SCHEME_REGEX   = "((http[s]?)://)?";  // match http or https before the ://
                                                                                const char* USER_REGEX = "(([^@/:\s]+)@)?"; // match anything other than @ / : or whitespace before the ending @
                                                                                const char* HOST_REGEX = "([^@/:\s]+)"; // mandatory. match anything other than @ / : or whitespace
                                                                                const char* PORT_REGEX = "(:([0-9]{1,5}))?"; // after the : match 1 to 5 digits
                                                                                const char* PATH_REGEX = "(/[^:#?\s]*)?"; // after the / match anything other than : # ? or whitespace
                                                                                const char* QUERY_REGEX = "(\?(([^?;&#=]+=[^?;&#=]+)([;|&]([^?;&#=]+=[^?;&#=]+))*))?"; // after the ? match any number of x=y pairs, seperated by & or ;
                                                                                const char* FRAGMENT_REGEX = "(#([^#\s]*))?"; // after the # match anything other than # or whitespace

                                                                                bool parseUri(const std::string &i_uri)
                                                                                {
                                                                                static const std::regex regExpr(std::string("^")
                                                                                + SCHEME_REGEX + USER_REGEX
                                                                                + HOST_REGEX + PORT_REGEX
                                                                                + PATH_REGEX + QUERY_REGEX
                                                                                + FRAGMENT_REGEX + "$");

                                                                                std::smatch matchResults;
                                                                                if (std::regex_match(i_uri.cbegin(), i_uri.cend(), matchResults, regExpr))
                                                                                {
                                                                                m_scheme.assign(matchResults[2].first, matchResults[2].second);
                                                                                m_user.assign(matchResults[4].first, matchResults[4].second);
                                                                                m_host.assign(matchResults[5].first, matchResults[5].second);
                                                                                m_port.assign(matchResults[7].first, matchResults[7].second);
                                                                                m_path.assign(matchResults[8].first, matchResults[8].second);
                                                                                m_query.assign(matchResults[10].first, matchResults[10].second);
                                                                                m_fragment.assign(matchResults[15].first, matchResults[15].second);

                                                                                return true;
                                                                                }

                                                                                return false;
                                                                                }


                                                                                I added explanations for each part of the regular expression. This way allows you to choose exactly the relevant parts to parse for the URL that you're expecting to get. Just remember to change the desired regular expression group indices accordingly.






                                                                                share|improve this answer




























                                                                                  1














                                                                                  May I offer another self-contained solution based on std::regex :



                                                                                  const char* SCHEME_REGEX   = "((http[s]?)://)?";  // match http or https before the ://
                                                                                  const char* USER_REGEX = "(([^@/:\s]+)@)?"; // match anything other than @ / : or whitespace before the ending @
                                                                                  const char* HOST_REGEX = "([^@/:\s]+)"; // mandatory. match anything other than @ / : or whitespace
                                                                                  const char* PORT_REGEX = "(:([0-9]{1,5}))?"; // after the : match 1 to 5 digits
                                                                                  const char* PATH_REGEX = "(/[^:#?\s]*)?"; // after the / match anything other than : # ? or whitespace
                                                                                  const char* QUERY_REGEX = "(\?(([^?;&#=]+=[^?;&#=]+)([;|&]([^?;&#=]+=[^?;&#=]+))*))?"; // after the ? match any number of x=y pairs, seperated by & or ;
                                                                                  const char* FRAGMENT_REGEX = "(#([^#\s]*))?"; // after the # match anything other than # or whitespace

                                                                                  bool parseUri(const std::string &i_uri)
                                                                                  {
                                                                                  static const std::regex regExpr(std::string("^")
                                                                                  + SCHEME_REGEX + USER_REGEX
                                                                                  + HOST_REGEX + PORT_REGEX
                                                                                  + PATH_REGEX + QUERY_REGEX
                                                                                  + FRAGMENT_REGEX + "$");

                                                                                  std::smatch matchResults;
                                                                                  if (std::regex_match(i_uri.cbegin(), i_uri.cend(), matchResults, regExpr))
                                                                                  {
                                                                                  m_scheme.assign(matchResults[2].first, matchResults[2].second);
                                                                                  m_user.assign(matchResults[4].first, matchResults[4].second);
                                                                                  m_host.assign(matchResults[5].first, matchResults[5].second);
                                                                                  m_port.assign(matchResults[7].first, matchResults[7].second);
                                                                                  m_path.assign(matchResults[8].first, matchResults[8].second);
                                                                                  m_query.assign(matchResults[10].first, matchResults[10].second);
                                                                                  m_fragment.assign(matchResults[15].first, matchResults[15].second);

                                                                                  return true;
                                                                                  }

                                                                                  return false;
                                                                                  }


                                                                                  I added explanations for each part of the regular expression. This way allows you to choose exactly the relevant parts to parse for the URL that you're expecting to get. Just remember to change the desired regular expression group indices accordingly.






                                                                                  share|improve this answer


























                                                                                    1












                                                                                    1








                                                                                    1







                                                                                    May I offer another self-contained solution based on std::regex :



                                                                                    const char* SCHEME_REGEX   = "((http[s]?)://)?";  // match http or https before the ://
                                                                                    const char* USER_REGEX = "(([^@/:\s]+)@)?"; // match anything other than @ / : or whitespace before the ending @
                                                                                    const char* HOST_REGEX = "([^@/:\s]+)"; // mandatory. match anything other than @ / : or whitespace
                                                                                    const char* PORT_REGEX = "(:([0-9]{1,5}))?"; // after the : match 1 to 5 digits
                                                                                    const char* PATH_REGEX = "(/[^:#?\s]*)?"; // after the / match anything other than : # ? or whitespace
                                                                                    const char* QUERY_REGEX = "(\?(([^?;&#=]+=[^?;&#=]+)([;|&]([^?;&#=]+=[^?;&#=]+))*))?"; // after the ? match any number of x=y pairs, seperated by & or ;
                                                                                    const char* FRAGMENT_REGEX = "(#([^#\s]*))?"; // after the # match anything other than # or whitespace

                                                                                    bool parseUri(const std::string &i_uri)
                                                                                    {
                                                                                    static const std::regex regExpr(std::string("^")
                                                                                    + SCHEME_REGEX + USER_REGEX
                                                                                    + HOST_REGEX + PORT_REGEX
                                                                                    + PATH_REGEX + QUERY_REGEX
                                                                                    + FRAGMENT_REGEX + "$");

                                                                                    std::smatch matchResults;
                                                                                    if (std::regex_match(i_uri.cbegin(), i_uri.cend(), matchResults, regExpr))
                                                                                    {
                                                                                    m_scheme.assign(matchResults[2].first, matchResults[2].second);
                                                                                    m_user.assign(matchResults[4].first, matchResults[4].second);
                                                                                    m_host.assign(matchResults[5].first, matchResults[5].second);
                                                                                    m_port.assign(matchResults[7].first, matchResults[7].second);
                                                                                    m_path.assign(matchResults[8].first, matchResults[8].second);
                                                                                    m_query.assign(matchResults[10].first, matchResults[10].second);
                                                                                    m_fragment.assign(matchResults[15].first, matchResults[15].second);

                                                                                    return true;
                                                                                    }

                                                                                    return false;
                                                                                    }


                                                                                    I added explanations for each part of the regular expression. This way allows you to choose exactly the relevant parts to parse for the URL that you're expecting to get. Just remember to change the desired regular expression group indices accordingly.






                                                                                    share|improve this answer













                                                                                    May I offer another self-contained solution based on std::regex :



                                                                                    const char* SCHEME_REGEX   = "((http[s]?)://)?";  // match http or https before the ://
                                                                                    const char* USER_REGEX = "(([^@/:\s]+)@)?"; // match anything other than @ / : or whitespace before the ending @
                                                                                    const char* HOST_REGEX = "([^@/:\s]+)"; // mandatory. match anything other than @ / : or whitespace
                                                                                    const char* PORT_REGEX = "(:([0-9]{1,5}))?"; // after the : match 1 to 5 digits
                                                                                    const char* PATH_REGEX = "(/[^:#?\s]*)?"; // after the / match anything other than : # ? or whitespace
                                                                                    const char* QUERY_REGEX = "(\?(([^?;&#=]+=[^?;&#=]+)([;|&]([^?;&#=]+=[^?;&#=]+))*))?"; // after the ? match any number of x=y pairs, seperated by & or ;
                                                                                    const char* FRAGMENT_REGEX = "(#([^#\s]*))?"; // after the # match anything other than # or whitespace

                                                                                    bool parseUri(const std::string &i_uri)
                                                                                    {
                                                                                    static const std::regex regExpr(std::string("^")
                                                                                    + SCHEME_REGEX + USER_REGEX
                                                                                    + HOST_REGEX + PORT_REGEX
                                                                                    + PATH_REGEX + QUERY_REGEX
                                                                                    + FRAGMENT_REGEX + "$");

                                                                                    std::smatch matchResults;
                                                                                    if (std::regex_match(i_uri.cbegin(), i_uri.cend(), matchResults, regExpr))
                                                                                    {
                                                                                    m_scheme.assign(matchResults[2].first, matchResults[2].second);
                                                                                    m_user.assign(matchResults[4].first, matchResults[4].second);
                                                                                    m_host.assign(matchResults[5].first, matchResults[5].second);
                                                                                    m_port.assign(matchResults[7].first, matchResults[7].second);
                                                                                    m_path.assign(matchResults[8].first, matchResults[8].second);
                                                                                    m_query.assign(matchResults[10].first, matchResults[10].second);
                                                                                    m_fragment.assign(matchResults[15].first, matchResults[15].second);

                                                                                    return true;
                                                                                    }

                                                                                    return false;
                                                                                    }


                                                                                    I added explanations for each part of the regular expression. This way allows you to choose exactly the relevant parts to parse for the URL that you're expecting to get. Just remember to change the desired regular expression group indices accordingly.







                                                                                    share|improve this answer












                                                                                    share|improve this answer



                                                                                    share|improve this answer










                                                                                    answered Nov 28 '18 at 18:47









                                                                                    Mr. JonesMr. Jones

                                                                                    112




                                                                                    112























                                                                                        0














                                                                                        There is yet another library https://snapwebsites.org/project/libtld which handles all possible top level domains and URI shema






                                                                                        share|improve this answer




























                                                                                          0














                                                                                          There is yet another library https://snapwebsites.org/project/libtld which handles all possible top level domains and URI shema






                                                                                          share|improve this answer


























                                                                                            0












                                                                                            0








                                                                                            0







                                                                                            There is yet another library https://snapwebsites.org/project/libtld which handles all possible top level domains and URI shema






                                                                                            share|improve this answer













                                                                                            There is yet another library https://snapwebsites.org/project/libtld which handles all possible top level domains and URI shema







                                                                                            share|improve this answer












                                                                                            share|improve this answer



                                                                                            share|improve this answer










                                                                                            answered Dec 20 '17 at 10:21









                                                                                            LarytetLarytet

                                                                                            1308




                                                                                            1308























                                                                                                0














                                                                                                I have developed an "object oriented" solution, one C++ class, that works with one regex like @Mr.Jones and @velcrow solutions. My Url class performs url/uri 'parsing'.



                                                                                                I think I improved velcrow regex to be more robust and includes also the username part.



                                                                                                Follows the first version of my idea, I have released the same code, improved, in my GPL3 licensed open source project Cpp URL Parser.



                                                                                                Omitted #ifdef/ndef bloat part, follows Url.h



                                                                                                #include <string>
                                                                                                #include <iostream>
                                                                                                #include <boost/regex.hpp>

                                                                                                using namespace std;

                                                                                                class Url {
                                                                                                public:
                                                                                                boost::regex ex;
                                                                                                string rawUrl;

                                                                                                string username;
                                                                                                string protocol;
                                                                                                string domain;
                                                                                                string port;
                                                                                                string path;
                                                                                                string query;
                                                                                                string fragment;

                                                                                                Url();

                                                                                                Url(string &rawUrl);

                                                                                                Url &update(string &rawUrl);
                                                                                                };


                                                                                                This is the code of the Url.cpp implementation file:



                                                                                                #include "Url.h"

                                                                                                Url::Url() {
                                                                                                this -> ex = boost::regex("(ssh|sftp|ftp|smb|http|https):\/\/(?:([^@ ]*)@)?([^:?# ]+)(?::(\d+))?([^?# ]*)(?:\?([^# ]*))?(?:#([^ ]*))?");
                                                                                                }

                                                                                                Url::Url(string &rawUrl) : Url() {
                                                                                                this->rawUrl = rawUrl;
                                                                                                this->update(this->rawUrl);
                                                                                                }

                                                                                                Url &Url::update(string &rawUrl) {
                                                                                                this->rawUrl = rawUrl;
                                                                                                boost::cmatch what;
                                                                                                if (regex_match(rawUrl.c_str(), what, ex)) {
                                                                                                this -> protocol = string(what[1].first, what[1].second);
                                                                                                this -> username = string(what[2].first, what[2].second);
                                                                                                this -> domain = string(what[3].first, what[3].second);
                                                                                                this -> port = string(what[4].first, what[4].second);
                                                                                                this -> path = string(what[5].first, what[5].second);
                                                                                                this -> query = string(what[6].first, what[6].second);
                                                                                                this -> fragment = string(what[7].first, what[7].second);
                                                                                                }
                                                                                                return *this;
                                                                                                }


                                                                                                Usage example:



                                                                                                string urlString = "http://gino@ciao.it:67/ciao?roba=ciao#34";
                                                                                                Url *url = new Url(urlString);
                                                                                                std::cout << " username: " << url->username << " URL domain: " << url->domain;
                                                                                                std::cout << " port: " << url->port << " protocol: " << url->protocol;


                                                                                                You can also update the Url object to represent (and parse) another URL:



                                                                                                url.update("http://gino@nuovociao.it:68/nuovociao?roba=ciaoooo#")


                                                                                                I'm learning C++ just now, so, I'm not sure I followed 100% C++ best-practises.
                                                                                                Any tip is appreciated.



                                                                                                P.s: let's look at Cpp URL Parser, there are refinements there.



                                                                                                Have fun






                                                                                                share|improve this answer






























                                                                                                  0














                                                                                                  I have developed an "object oriented" solution, one C++ class, that works with one regex like @Mr.Jones and @velcrow solutions. My Url class performs url/uri 'parsing'.



                                                                                                  I think I improved velcrow regex to be more robust and includes also the username part.



                                                                                                  Follows the first version of my idea, I have released the same code, improved, in my GPL3 licensed open source project Cpp URL Parser.



                                                                                                  Omitted #ifdef/ndef bloat part, follows Url.h



                                                                                                  #include <string>
                                                                                                  #include <iostream>
                                                                                                  #include <boost/regex.hpp>

                                                                                                  using namespace std;

                                                                                                  class Url {
                                                                                                  public:
                                                                                                  boost::regex ex;
                                                                                                  string rawUrl;

                                                                                                  string username;
                                                                                                  string protocol;
                                                                                                  string domain;
                                                                                                  string port;
                                                                                                  string path;
                                                                                                  string query;
                                                                                                  string fragment;

                                                                                                  Url();

                                                                                                  Url(string &rawUrl);

                                                                                                  Url &update(string &rawUrl);
                                                                                                  };


                                                                                                  This is the code of the Url.cpp implementation file:



                                                                                                  #include "Url.h"

                                                                                                  Url::Url() {
                                                                                                  this -> ex = boost::regex("(ssh|sftp|ftp|smb|http|https):\/\/(?:([^@ ]*)@)?([^:?# ]+)(?::(\d+))?([^?# ]*)(?:\?([^# ]*))?(?:#([^ ]*))?");
                                                                                                  }

                                                                                                  Url::Url(string &rawUrl) : Url() {
                                                                                                  this->rawUrl = rawUrl;
                                                                                                  this->update(this->rawUrl);
                                                                                                  }

                                                                                                  Url &Url::update(string &rawUrl) {
                                                                                                  this->rawUrl = rawUrl;
                                                                                                  boost::cmatch what;
                                                                                                  if (regex_match(rawUrl.c_str(), what, ex)) {
                                                                                                  this -> protocol = string(what[1].first, what[1].second);
                                                                                                  this -> username = string(what[2].first, what[2].second);
                                                                                                  this -> domain = string(what[3].first, what[3].second);
                                                                                                  this -> port = string(what[4].first, what[4].second);
                                                                                                  this -> path = string(what[5].first, what[5].second);
                                                                                                  this -> query = string(what[6].first, what[6].second);
                                                                                                  this -> fragment = string(what[7].first, what[7].second);
                                                                                                  }
                                                                                                  return *this;
                                                                                                  }


                                                                                                  Usage example:



                                                                                                  string urlString = "http://gino@ciao.it:67/ciao?roba=ciao#34";
                                                                                                  Url *url = new Url(urlString);
                                                                                                  std::cout << " username: " << url->username << " URL domain: " << url->domain;
                                                                                                  std::cout << " port: " << url->port << " protocol: " << url->protocol;


                                                                                                  You can also update the Url object to represent (and parse) another URL:



                                                                                                  url.update("http://gino@nuovociao.it:68/nuovociao?roba=ciaoooo#")


                                                                                                  I'm learning C++ just now, so, I'm not sure I followed 100% C++ best-practises.
                                                                                                  Any tip is appreciated.



                                                                                                  P.s: let's look at Cpp URL Parser, there are refinements there.



                                                                                                  Have fun






                                                                                                  share|improve this answer




























                                                                                                    0












                                                                                                    0








                                                                                                    0







                                                                                                    I have developed an "object oriented" solution, one C++ class, that works with one regex like @Mr.Jones and @velcrow solutions. My Url class performs url/uri 'parsing'.



                                                                                                    I think I improved velcrow regex to be more robust and includes also the username part.



                                                                                                    Follows the first version of my idea, I have released the same code, improved, in my GPL3 licensed open source project Cpp URL Parser.



                                                                                                    Omitted #ifdef/ndef bloat part, follows Url.h



                                                                                                    #include <string>
                                                                                                    #include <iostream>
                                                                                                    #include <boost/regex.hpp>

                                                                                                    using namespace std;

                                                                                                    class Url {
                                                                                                    public:
                                                                                                    boost::regex ex;
                                                                                                    string rawUrl;

                                                                                                    string username;
                                                                                                    string protocol;
                                                                                                    string domain;
                                                                                                    string port;
                                                                                                    string path;
                                                                                                    string query;
                                                                                                    string fragment;

                                                                                                    Url();

                                                                                                    Url(string &rawUrl);

                                                                                                    Url &update(string &rawUrl);
                                                                                                    };


                                                                                                    This is the code of the Url.cpp implementation file:



                                                                                                    #include "Url.h"

                                                                                                    Url::Url() {
                                                                                                    this -> ex = boost::regex("(ssh|sftp|ftp|smb|http|https):\/\/(?:([^@ ]*)@)?([^:?# ]+)(?::(\d+))?([^?# ]*)(?:\?([^# ]*))?(?:#([^ ]*))?");
                                                                                                    }

                                                                                                    Url::Url(string &rawUrl) : Url() {
                                                                                                    this->rawUrl = rawUrl;
                                                                                                    this->update(this->rawUrl);
                                                                                                    }

                                                                                                    Url &Url::update(string &rawUrl) {
                                                                                                    this->rawUrl = rawUrl;
                                                                                                    boost::cmatch what;
                                                                                                    if (regex_match(rawUrl.c_str(), what, ex)) {
                                                                                                    this -> protocol = string(what[1].first, what[1].second);
                                                                                                    this -> username = string(what[2].first, what[2].second);
                                                                                                    this -> domain = string(what[3].first, what[3].second);
                                                                                                    this -> port = string(what[4].first, what[4].second);
                                                                                                    this -> path = string(what[5].first, what[5].second);
                                                                                                    this -> query = string(what[6].first, what[6].second);
                                                                                                    this -> fragment = string(what[7].first, what[7].second);
                                                                                                    }
                                                                                                    return *this;
                                                                                                    }


                                                                                                    Usage example:



                                                                                                    string urlString = "http://gino@ciao.it:67/ciao?roba=ciao#34";
                                                                                                    Url *url = new Url(urlString);
                                                                                                    std::cout << " username: " << url->username << " URL domain: " << url->domain;
                                                                                                    std::cout << " port: " << url->port << " protocol: " << url->protocol;


                                                                                                    You can also update the Url object to represent (and parse) another URL:



                                                                                                    url.update("http://gino@nuovociao.it:68/nuovociao?roba=ciaoooo#")


                                                                                                    I'm learning C++ just now, so, I'm not sure I followed 100% C++ best-practises.
                                                                                                    Any tip is appreciated.



                                                                                                    P.s: let's look at Cpp URL Parser, there are refinements there.



                                                                                                    Have fun






                                                                                                    share|improve this answer















                                                                                                    I have developed an "object oriented" solution, one C++ class, that works with one regex like @Mr.Jones and @velcrow solutions. My Url class performs url/uri 'parsing'.



                                                                                                    I think I improved velcrow regex to be more robust and includes also the username part.



                                                                                                    Follows the first version of my idea, I have released the same code, improved, in my GPL3 licensed open source project Cpp URL Parser.



                                                                                                    Omitted #ifdef/ndef bloat part, follows Url.h



                                                                                                    #include <string>
                                                                                                    #include <iostream>
                                                                                                    #include <boost/regex.hpp>

                                                                                                    using namespace std;

                                                                                                    class Url {
                                                                                                    public:
                                                                                                    boost::regex ex;
                                                                                                    string rawUrl;

                                                                                                    string username;
                                                                                                    string protocol;
                                                                                                    string domain;
                                                                                                    string port;
                                                                                                    string path;
                                                                                                    string query;
                                                                                                    string fragment;

                                                                                                    Url();

                                                                                                    Url(string &rawUrl);

                                                                                                    Url &update(string &rawUrl);
                                                                                                    };


                                                                                                    This is the code of the Url.cpp implementation file:



                                                                                                    #include "Url.h"

                                                                                                    Url::Url() {
                                                                                                    this -> ex = boost::regex("(ssh|sftp|ftp|smb|http|https):\/\/(?:([^@ ]*)@)?([^:?# ]+)(?::(\d+))?([^?# ]*)(?:\?([^# ]*))?(?:#([^ ]*))?");
                                                                                                    }

                                                                                                    Url::Url(string &rawUrl) : Url() {
                                                                                                    this->rawUrl = rawUrl;
                                                                                                    this->update(this->rawUrl);
                                                                                                    }

                                                                                                    Url &Url::update(string &rawUrl) {
                                                                                                    this->rawUrl = rawUrl;
                                                                                                    boost::cmatch what;
                                                                                                    if (regex_match(rawUrl.c_str(), what, ex)) {
                                                                                                    this -> protocol = string(what[1].first, what[1].second);
                                                                                                    this -> username = string(what[2].first, what[2].second);
                                                                                                    this -> domain = string(what[3].first, what[3].second);
                                                                                                    this -> port = string(what[4].first, what[4].second);
                                                                                                    this -> path = string(what[5].first, what[5].second);
                                                                                                    this -> query = string(what[6].first, what[6].second);
                                                                                                    this -> fragment = string(what[7].first, what[7].second);
                                                                                                    }
                                                                                                    return *this;
                                                                                                    }


                                                                                                    Usage example:



                                                                                                    string urlString = "http://gino@ciao.it:67/ciao?roba=ciao#34";
                                                                                                    Url *url = new Url(urlString);
                                                                                                    std::cout << " username: " << url->username << " URL domain: " << url->domain;
                                                                                                    std::cout << " port: " << url->port << " protocol: " << url->protocol;


                                                                                                    You can also update the Url object to represent (and parse) another URL:



                                                                                                    url.update("http://gino@nuovociao.it:68/nuovociao?roba=ciaoooo#")


                                                                                                    I'm learning C++ just now, so, I'm not sure I followed 100% C++ best-practises.
                                                                                                    Any tip is appreciated.



                                                                                                    P.s: let's look at Cpp URL Parser, there are refinements there.



                                                                                                    Have fun







                                                                                                    share|improve this answer














                                                                                                    share|improve this answer



                                                                                                    share|improve this answer








                                                                                                    edited Dec 13 '18 at 13:47

























                                                                                                    answered Dec 10 '18 at 16:48









                                                                                                    Fabiano TarlaoFabiano Tarlao

                                                                                                    1,4532226




                                                                                                    1,4532226























                                                                                                        0














                                                                                                        A small dependency you can use is uriparser, which recently moved to GitHub.



                                                                                                        You can find a minimal example in their code: https://github.com/uriparser/uriparser/blob/63384be4fb8197264c55ff53a135110ecd5bd8c4/tool/uriparse.c



                                                                                                        This will be more lightweight than Boost or Poco. The only catch is that it is C.



                                                                                                        There is also a Buckaroo package:



                                                                                                        buckaroo add github.com/buckaroo-pm/uriparser





                                                                                                        share|improve this answer




























                                                                                                          0














                                                                                                          A small dependency you can use is uriparser, which recently moved to GitHub.



                                                                                                          You can find a minimal example in their code: https://github.com/uriparser/uriparser/blob/63384be4fb8197264c55ff53a135110ecd5bd8c4/tool/uriparse.c



                                                                                                          This will be more lightweight than Boost or Poco. The only catch is that it is C.



                                                                                                          There is also a Buckaroo package:



                                                                                                          buckaroo add github.com/buckaroo-pm/uriparser





                                                                                                          share|improve this answer


























                                                                                                            0












                                                                                                            0








                                                                                                            0







                                                                                                            A small dependency you can use is uriparser, which recently moved to GitHub.



                                                                                                            You can find a minimal example in their code: https://github.com/uriparser/uriparser/blob/63384be4fb8197264c55ff53a135110ecd5bd8c4/tool/uriparse.c



                                                                                                            This will be more lightweight than Boost or Poco. The only catch is that it is C.



                                                                                                            There is also a Buckaroo package:



                                                                                                            buckaroo add github.com/buckaroo-pm/uriparser





                                                                                                            share|improve this answer













                                                                                                            A small dependency you can use is uriparser, which recently moved to GitHub.



                                                                                                            You can find a minimal example in their code: https://github.com/uriparser/uriparser/blob/63384be4fb8197264c55ff53a135110ecd5bd8c4/tool/uriparse.c



                                                                                                            This will be more lightweight than Boost or Poco. The only catch is that it is C.



                                                                                                            There is also a Buckaroo package:



                                                                                                            buckaroo add github.com/buckaroo-pm/uriparser






                                                                                                            share|improve this answer












                                                                                                            share|improve this answer



                                                                                                            share|improve this answer










                                                                                                            answered Mar 20 at 17:22









                                                                                                            sdgfsdhsdgfsdh

                                                                                                            8,608843100




                                                                                                            8,608843100






























                                                                                                                draft saved

                                                                                                                draft discarded




















































                                                                                                                Thanks for contributing an answer to Stack Overflow!


                                                                                                                • Please be sure to answer the question. Provide details and share your research!

                                                                                                                But avoid



                                                                                                                • Asking for help, clarification, or responding to other answers.

                                                                                                                • Making statements based on opinion; back them up with references or personal experience.


                                                                                                                To learn more, see our tips on writing great answers.




                                                                                                                draft saved


                                                                                                                draft discarded














                                                                                                                StackExchange.ready(
                                                                                                                function () {
                                                                                                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f2616011%2feasy-way-to-parse-a-url-in-c-cross-platform%23new-answer', 'question_page');
                                                                                                                }
                                                                                                                );

                                                                                                                Post as a guest















                                                                                                                Required, but never shown





















































                                                                                                                Required, but never shown














                                                                                                                Required, but never shown












                                                                                                                Required, but never shown







                                                                                                                Required, but never shown

































                                                                                                                Required, but never shown














                                                                                                                Required, but never shown












                                                                                                                Required, but never shown







                                                                                                                Required, but never shown







                                                                                                                Popular posts from this blog

                                                                                                                A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

                                                                                                                Calculate evaluation metrics using cross_val_predict sklearn

                                                                                                                Insert data from modal to MySQL (multiple modal on website)