织梦CMS - 轻松建站从此开始!

罗索

一个用于url解析的C++类

jackyhwei 发布于 2011-10-19 20:05 点击:次 
参考了不少C++类库,然后自己试着写了一个。请大家指正了:)昨天晚上又搞了搞这个URL解析类,发现了不少问题。今天查看了相关的RFC1738文档,发现要对付的URL种类好多。:(这下又要重新设计类体系了。
TAG:

参考了不少C++类库,然后自己试着写了一个。请大家指正了:)

#include <string>

const int NOPOS = -1;

class urlparser
{
     typedef std::string Stringt;
public:
     urlparser(const Stringt &url)
          : url_(url),
           protpos_(NOPOS),
         dnpos_(NOPOS),
         userpos_(NOPOS),
         pwendpos_(NOPOS),
         portpos_(NOPOS),
         pathpos_(NOPOS),
         filepos_(NOPOS),
         parampos_(NOPOS)
     {
          parseurl();
     }

     urlparser(const char *url)
          : url_(url),
           protpos_(NOPOS),
         dnpos_(NOPOS),
         userpos_(NOPOS),
         pwendpos_(NOPOS),
         portpos_(NOPOS),
         pathpos_(NOPOS),
         filepos_(NOPOS),
         parampos_(NOPOS)
     {
          parseurl();
     }

     Stringt geturl()
     {
          return url_;
     }

     Stringt getprotocol()
     {
          if(protpos_ != NOPOS)
              return url_.substr(0, protpos_);
          else
              return "";
     }

     Stringt getdomain()
     {
          if(dnpos_ != NOPOS && portpos_ != NOPOS)
              return url_.substr(dnpos_, portpos_ - 1 - dnpos_);
          else if(dnpos_ != NOPOS && pathpos_ != NOPOS)
              return url_.substr(dnpos_, pathpos_ - dnpos_);
          else
              return "";
     }

     Stringt getport()
     {
          if(portpos_ != NOPOS && pathpos_ != NOPOS)
              return url_.substr(portpos_, pathpos_ - portpos_);
          else
              return "";
     }

     Stringt getpath()
     {
          if(pathpos_ != NOPOS && filepos_ != NOPOS)
              return url_.substr(pathpos_, filepos_ - pathpos_);
          else if(pathpos_ != NOPOS && parampos_ != NOPOS)
              return url_.substr(pathpos_, parampos_ - 1 - pathpos_);
          else if(pathpos_ != NOPOS)
              return url_.substr(pathpos_, url_.length() - 1);
          else
              return "";
     }

     Stringt getfile()
     {
          if(filepos_ != NOPOS && parampos_ != NOPOS)
              return url_.substr(filepos_, parampos_ - 1 - filepos_);
          else if(filepos_ != NOPOS)
              return url_.substr(filepos_, url_.length() - 1);
          else
              return "";
     }

     Stringt getparameter()
     {
          if(parampos_ != NOPOS && anchorpos_ != NOPOS)
              return url_.substr(parampos_, anchorpos_ - 1 - parampos_);
          else if(parampos_ != NOPOS)
              return url_.substr(parampos_, url_.length() - 1);
          else
              return "";
     }

     Stringt getanchor()
     {
          if(anchorpos_ != NOPOS)
              return url_.substr(anchorpos_, url_.length() - 1);
          else
              return "";
     }

     Stringt gethost()
     {
          return url_.substr(dnpos_, pathpos_ - dnpos_);
     }

     Stringt getreferer()
     {
          return url_.substr(0, pathpos_);
     }

private:
     void parseurl()
     {
          Stringt::size_type beginpos = 0, endpos = 0;

          beginpos = url_.find(&#39;:&#39;, 0);
          endpos = url_.find(&#39;/&#39;, 0);
          if(beginpos != Stringt::npos && beginpos < endpos && beginpos < url_.find(&#39;.&#39;, 0))
          {
              protpos_ = beginpos;
              beginpos = url_.find(&#39;/&#39;, endpos + 1) + 1;
              dnpos_ = beginpos;
          }
          else
          {
              dnpos_ = 0;
              beginpos = dnpos_;
          }

          endpos = url_.find(&#39;:&#39;, beginpos);
          if(endpos != Stringt::npos)
          {
              portpos_ = endpos + 1;
              beginpos = endpos;
          }

          endpos = url_.find(&#39;/&#39;, beginpos);
          if(endpos != Stringt::npos)
          {
              pathpos_ = endpos;
          }
          else
          {
              url_ = url_ + &#39;/&#39;;
              endpos = url_.find(&#39;/&#39;, beginpos);
              pathpos_ = endpos;
          }

          beginpos = endpos;
          endpos = url_.find(&#39;.&#39;, beginpos);
          if(endpos != Stringt::npos)
          {
              beginpos = url_.rfind(&#39;/&#39;, endpos) + 1;
              filepos_ = beginpos;
          }

          beginpos = url_.find(&#39;?&#39;, beginpos);
          if(beginpos != Stringt::npos)
          {
              parampos_ = beginpos + 1;
          }

          beginpos = url_.rfind(&#39;#&#39;, url_.length() - 1);
          if(beginpos != Stringt::npos)
          {
              anchorpos_ = beginpos + 1;
          }
     }

private:
     Stringt url_;
     size_t protpos_;
     size_t dnpos_;
     size_t userpos_;
     size_t pwendpos_;
     size_t portpos_;
     size_t pathpos_;
     size_t filepos_;
     size_t parampos_;
     size_t anchorpos_;
};

(无锋之刃)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201110/15165.html]
本文出处:forum.eviloctal.com 作者:无锋之刃
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容