好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#Url操作类封装、仿Node.Js中的Url模块实例

在实际开发中,需要用到的数据在url中,因此就需要我们来获取到url中有用的信息,涉及到查询、添加、修改、删除等操作,下面我们就具体来了解一下。

1.简单实例

目前常用url操作,查询、添加、修改、删除链接参数,重构生成链接等功能。

?

//string url = "http://HdhCmsTestgongjuji.net:8081";

//string url = "http://HdhCmsTestgongjuji.net/";

//string url = "http://HdhCmsTestgongjuji.net/abc";

// string url = "http://HdhCmsTestgongjuji.net/abc/1234.html";

string url = "http://HdhCmsTestgongjuji.net/abc/1234.html?name=张三&age=1234#one#two" ;

//string url = "http://HdhCmsTestgongjuji.net/abc/1234.html?name=&age=#one#two";

//string url = "/abc/123.html?name=张三&age=1234#one#two";

// string url = "https://mp.weixin.qq测试数据/debug/cgi-bin/apiinfo?t=index&type=%e7%94%a8%e6%88%b7%e7%ae%a1%e7%90%86&form=%e8%8e%b7%e5%8f%96%e5%85%b3%e6%b3%a8%e8%80%85%e5%88%97%e8%a1%a8%e6%8e%a5%e5%8f%a3%20/user/get";

urlanalyze _url = new urlanalyze(url);

jobject obj = jobject.fromobject(_url);

console.writeline(obj);

//添加或修改参数

_url.addorupdatesearch( "page" , "2" );

_url.addorupdatesearch( "name" , "李四" );

//重新生成链接参数

console.writeline(_url.geturl());

console.writeline(_url.geturl( true ));

2、实例:

识别字符串中的url

?

//string source = "工具集:http://HdhCmsTestgongjuji.net";

string source = @"工具集:

   http://HdhCmsTestgongjuji.net

   爱汉字:http://hanzi.tianma3798.cn" ;

list< string > result = urlanalyze.geturllist(source);

foreach (var item in result)

{

   console.writeline(item);

}

//替换成a标签

string result2 = urlanalyze.replacetoa(source);

console.writeline(result2);</ string >

属性和部分功能模仿了node.js的url模块

源代码定义:

?

/// <summary>

/// url地址的格式化和反格式化

/// </summary>

public class urlanalyze

{

   /// <summary>

   /// 协议名称

   /// </summary>

   public string protocol { get ; set ; }

   /// <summary>

   /// 是否以反斜杠结尾

   /// </summary>

   public bool slashes { get ; set ; }

   /// <summary>

   /// 验证信息,暂时不使用

   /// </summary>

   public string auth { get ; set ; }

   /// <summary>

   /// 全小写主机部分,包括端口

   /// </summary>

   public string host

   {

     get

     {

       if ( this .port == null )

         return this .hostname;

       return string .format( "{0}:{1}" , this .hostname, this .port);

     }

   }

   /// <summary>

   /// 端口,为空时http默认是80

   /// </summary>

   public int ? port { get ; set ; }

   /// <summary>

   /// 小写主机部分

   /// </summary>

   public string hostname { get ; set ; }

   /// <summary>

   /// 页面锚点参数部分 #one#two

   /// </summary>

   public string hash { get ; set ; }

   /// <summary>

   /// 链接查询参数部分(带问号) ?one=1&two=2

   /// </summary>

   public string search { get ; set ; }

   /// <summary>

   /// 路径部分

   /// </summary>

   public string pathname { get ; set ; }

   /// <summary>

   /// 路径+参数部分(没有锚点)

   /// </summary>

   public string path

   {

     get

     {

       if ( string .isnullorempty( this .search))

         return this .pathname;

       return pathname + search;

     }

   }

   /// <summary>

   /// 转码后的原链接

   /// </summary>

   public string href { get ; set ; }

 

   /// <summary>

   /// 参数的key=value 列表

   /// </summary>

   private dictionary< string , string = "" > _searchlist = null ;

   #region 初始化处理

   /// <summary>

   /// 空初始化

   /// </summary>

   public urlanalyze() { _searchlist = new dictionary< string , string = "" >(); }

   /// <summary>

   /// 初始化处理

   /// </summary>

   ///<param name="url">指定相对或绝对链接

   public urlanalyze( string url)

   {

     //1.转码操作

     this .href = httputility.urldecode(url);

     initparse( this .href);

     //是否反斜杠结尾

     if (! string .isnullorempty(pathname))

       this .slashes = this .pathname.endswith( "/" );

     //初始化参数列表

     _searchlist = getsearchlist();

   }

   /// <summary>

   /// 将字符串格式化成对象时初始化处理

   /// </summary>

   private void initparse( string url)

   {

     //判断是否是指定协议的绝对路径

     if (url.contains( "://" ))

     {

       // regex reg = new regex(@"(\w+):\/\/([^/:]+)(:\d*)?([^ ]*)");

       regex reg = new regex( @"(\w+):\/\/([^/:]+)(:\d*)?(.*)" );

       match match = reg.match(url);

       //协议名称

       this .protocol = match.result( "$1" );

       //主机

       this .hostname = match.result( "$2" );

       //端口

       string port = match.result( "$3" );

       if ( string .isnullorempty(port) == false )

       {

         port = port.replace( ":" , "" );

         this .port = convert.toint32(port);

       }

       //路径和查询参数

       string path = match.result( "$4" );

       if ( string .isnullorempty(path) == false )

         initpath(path);

     }

     else

     {

       initpath(url);

     }

   }

   /// <summary>

   /// 字符串url格式化时,路径和参数的初始化处理

   /// </summary>

   ///<param name="path">

   private void initpath( string path)

   {

     regex reg = new regex( @"([^#?& ]*)(\??[^#]*)(#?[^?& ]*)" );

     match match = reg.match(path);

     //路径和查询参数

     this .pathname = match.result( "$1" );

     this .search = match.result( "$2" );

     this .hash = match.result( "$3" );

   }

   #endregion

 

   #region 参数处理

   /// <summary>

   /// 获取当前参数解析结果字典列表

   /// </summary>

   /// <returns></returns>

   public dictionary< string , string = "" > getsearchlist()

   {

     if (_searchlist != null )

       return _searchlist;

     _searchlist = new dictionary< string , string = "" >();

     if (! string .isnullorempty(search))

     {

       regex reg = new regex( @"(^|&)?(\w+)=([^&]*)" , regexoptions测试数据piled);

       matchcollection coll = reg.matches(search);

       foreach (match item in coll)

       {

         string key = item.result( "$2" ).tolower();

         string value = item.result( "$3" );

         _searchlist.add(key, value);

       }

     }

     return _searchlist;

   }

   /// <summary>

   /// 获取查询参数的值

   /// </summary>

   ///<param name="key">键

   /// <returns></returns>

   public string getsearchvalue( string key)

   {

     return _searchlist[key];

   }

   /// <summary>

   /// 添加参数key=value,如果值已经存在则修改

   /// </summary>

   ///<param name="key">键

   ///<param name="value">值

   /// <returns></returns>

   public void addorupdatesearch( string key, string value, bool encode = false )

   {

     if (encode)

       value = httputility.urlencode(value);

     //判断指定键值是否存在

     if (_searchlist.containskey(key))

     {

       _searchlist[key] = value;

     }

     else

     {

       _searchlist.add(key, value);

     }

   }

   /// <summary>

   /// 删除指定key 的键值对

   /// </summary>

   ///<param name="key">键

   public void remove( string key)

   {

     if (_searchlist.any(q => q.key == key))

       _searchlist.remove(key);

   }

   /// <summary>

   /// 获取锚点列表

   /// </summary>

   /// <returns></returns>

   public list< string > gethashlist()

   {

     list< string > list = new list< string >();

     if (! string .isnullorempty(hash))

     {

       list = hash.split( '#' ).where(q => string .isnullorempty(q) == false )

         .tolist();

     }

     return list;

   }

   #endregion

   /// <summary>

   /// 获取最终url地址,

   /// 对参数值就行urlencode 编码后,有可能和原链接不相同

   /// </summary>

   /// <returns></returns>

   public string geturl( bool encodevalue = false )

   {

     stringbuilder builder = new stringbuilder();

     if (! string .isnullorempty(protocol))

     {

       //如果有协议

       builder.append(protocol).append( "://" );

     }

     //如果有主机标识

     builder.append(host);

     //如果有目录和参数

     if (! string .isnullorempty(pathname))

     {

       string pathname = pathname;

       if (pathname.endswith( "/" ))

         pathname = pathname.substring(0, pathname.length - 1);

       builder.append(pathname);

     }

     //判断是否反斜杠

     if (slashes)

     {

       builder.append( "/" );

     }

     dictionary< string , string = "" > searchlist = getsearchlist();

     if (searchlist != null && searchlist.count > 0)

     {

       builder.append( "?" );

       bool isfirst = true ;

       foreach (var item in searchlist)

       {

         if (isfirst == false )

         {

           builder.append( "&" );

         }

         isfirst = false ;

         builder.appendformat( "{0}={1}" , item.key, encodevalue ? httputility.urlencode(item.value) : item.value);

       }

     }

     //锚点

     builder.append(hash);

     return builder.tostring();

   }

   #region 静态方法

   /// <summary>

   /// 获取源字符串中所有的链接(可能有重复)

   /// </summary>

   ///<param name="content">源字符串

   /// <returns></returns>

   public static list< string > geturllist( string content)

   {

     list< string > list = new list< string >();

     regex re = new regex( @"(?<url>http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?)" );

     matchcollection mc = re.matches(content);

     foreach (match m in mc)

     {

       if (m.success)

       {

         string url = m.result( "${url}" );

         list.add(url);

       }

     }

     return list;

   }

   /// <summary>

   /// 将字符串中的链接成标签

   /// </summary>

   ///<param name="content">

   /// <returns></returns>

   public static string replacetoa( string content)

   {

     regex re = new regex( @"(?<url>http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?)" );

     matchcollection mc = re.matches(content);

     foreach (match m in mc)

     {

       content = content.replace(m.result( "${url}" ), string .format( "</url>{0}" , m.result( "${url}" )));

     }

     return content;

   }

   #endregion

}</url></ string ></ string ></ string ></ string ,></ string ></ string ></ string ></ string ,></ string ,></ string ,></ string ,>

所属源代码库:https://github测试数据/tianma3798/common

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

dy("nrwz");

查看更多关于C#Url操作类封装、仿Node.Js中的Url模块实例的详细内容...

  阅读:44次