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

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

1.简单实例

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

 //string url = "http://www.gongjuji.net:8081";
//string url = "http://www.gongjuji.net/";
//string url = "http://www.gongjuji.net/abc";
// string url = "http://www.gongjuji.net/abc/1234.html";
string url = "http://www.gongjuji.net/abc/1234.html?name=张三&age=1234#one#two";
//string url = "http://www.gongjuji.net/abc/1234.html?name=&age=#one#two";
//string url = "/abc/123.html?name=张三&age=1234#one#two";
// string url = "https://mp.weixin.qq.com/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://www.gongjuji.net";
string source = @"工具集:
  http://www.gongjuji.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.Compiled);
      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.com/tianma3798/Common

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索url实例
, node.js实例
url封装
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-04 22:49:34

C#Url操作类封装、仿Node.Js中的Url模块实例_C#教程的相关文章

Node.js中对通用模块的封装方法_node.js

在Node.js中对模块载入和执行进行了包装,使得模块文件中的变量在一个闭包中,不会污染全局变量,和他人冲突. 前端模块通常是我们开发人员为了避免和他人冲突才把模块代码放置在一个闭包中. 如何封装Node.js和前端通用的模块,我们可以参考Underscore.js 实现,他就是一个Node.js和前端通用的功能函数模块,查看代码: 复制代码 代码如下:  // Create a safe reference to the Underscore object for use below.  va

Node.js中路径处理模块path详解_node.js

前言 在node.js中,提供了一个path某块,在这个模块中,提供了许多使用的,可被用来处理与转换路径的方法与属性,将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了.下面我们就来详细介绍下关于Node.js中的路径处理模块path. 获取路径/文件名/扩展名      获取路径:path.dirname(filepath)      获取文件名:path.basename(filepath)      获取扩展名:path.extname(filepath) 获取所在路径 例子如下

node.js中的url.parse方法使用说明_node.js

方法说明: 讲一个URL字符串转换成对象并返回. 语法: 复制代码 代码如下: url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) 接收参数: urlStr                                       url字符串 parseQueryString                   为true时将使用查询模块分析查询字符串,默认为false slashesDenoteHost           

node.js中的url.format方法使用说明_node.js

方法说明: 将一个解析后的URL对象.转成.一个格式化的URL字符串. 语法: 复制代码 代码如下: url.format(urlObj) 接收参数: urlObj 表示 URL对象,可包含以下属性:(可对照例子) href                      完整路径 protocolis            协议(如http://) auth                     hostname            主机名 port                      端

使用node.js中的Buffer类处理二进制数据的方法_node.js

前言 在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区.这篇文章就详细介绍了node.js中的Buffer类处理二进制数据的方法,下面话不多说,来看看详细的介绍. 创建Buffer对象 第一种:直接使用一个数组来初始化缓存区 var arr = [0,1,2] var buf = new Buffer(arr) console.log(buf) 执行效果: 第二种:直接使用一个字符串来初始化缓存区 var str = 'hello' var buf = n

Node.js中常规的文件操作总结_node.js

前言 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API. Node 导入文件系统模块(fs)语法如下所示: var fs = require("fs") fs模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX文件系统操作.与其他模块不同的是,fs模块中所有的操作都提供了异步和同步的两个版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync() . 一. 目录操作 1. 创建目录 创

Asp.net(c#)常用文件操作类封装 移动 复制 删除 上传 下载等

Asp.net(c#)中常用文件操作类封装 包括:移动 复制 删除 上传 下载等 using System; using System.Configuration; using System.Data; using System.IO; using System.Text; using System.Threading; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.Ht

Node.js之HTPP URL

几乎每门编程语言都会包括网络这块,Node.js也不例外.今天主要是熟悉下Node.js中HTTP服务.其实HTTP模块是相当低层次的,它不提供路由.cookie.缓存等,像Web开发中不会直接使用,但还是要熟悉下,这样也方便以后的学习. 一.统一资源标识符URL 这个是非常常见的,在Node.js中有几种处理. http://user:pass@host.com:80/resource/path/?query=string#hash 协议://身份认证@主机名.com:端口/路径/搜索/查询#

在Node.js中使用HTTP上传文件的方法

  这篇文章主要介绍了在Node.js中使用HTTP上传文件的方法,作者以windows下的visual studio作为操作node的环境,推荐阅读!需要的朋友可以参考下 开发环境 我们将使用 Visual Studio Express 2013 for Web 作为开发环境, 不过它还不能被用来做 Node.js 开发.为此我们需要安装 Node.js Tools for Visual Studio. 装好后 Visual Studio Express 2013 for Web 就会转变成一