发新话题
打印

[原创]一个用于url解析的C++类

[原创]一个用于url解析的C++类

文章作者:无锋之刃[EST顾问团成员]
信息来源:邪恶八进制 中国

参考了不少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_;
};
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

听说我无锋之刃大哥为了玩游戏做外挂 猛啃高级编程....
学习精神真是值得敬佩 但是动机就......<_<
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

只有战场才是检验好枪的地方。

实践出真知嘛:)

而且我觉得游戏利用的技术是最多的。通过做游戏,可以学到很多东西。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

姜还是老的辣哈哈!大哥就是大哥:)厉害!
垃圾一个,00...

TOP

发现一些问题:当我贴这些代码的时候,有些下划线被X掉了?
还有些英文字母也不见了?真奇怪。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

呃……这样的话就比较麻烦了,我写的代码都是这种风格的。咋办好涅?
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

使用[CODE] [/CODE]看看行不行.......
BLOG: http://blog.csdn.net/hkbyest

TOP

噢噢,嗷嗷,下次发代码的时候再试试。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

早盼着无锋兄帖代码啦

好好学习 天天向上

TOP

游戏确实需要的技术很全面  尤其是游戏开发者!
请加47809945   100%通过!每个月总有那么几天,您的网络会受到黑客的攻击--坐立不安,烦躁无力,使用虎虎开发的"月月舒"防火墙,超轻超薄,易于携带,提供由内到外的全方位保护,即使流量再大,也可以冲浪自如,再也不用担心侧漏啦。

TOP

昨天晚上又搞了搞这个URL解析类,发现了不少问题。
今天查看了相关的RFC1738文档,发现要对付的URL种类好多。
:(
这下又要重新设计类体系了。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

发新话题