C#实现类似新浪微博长URL转短地址的方法

2014-01-08  来源:本站原创  分类:C#教程  人气:41 

这篇文章主要介绍了C#实现类似新浪微博长URL转短地址的方法,涉及C#操作正则表达式的相关技巧,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了C#实现类似新浪微博长URL转短地址的方法。分享给大家供大家参考。具体如下:

一、前台判断用户输入URL的JS代码如下。

function CheckInput() {
 var $txtLength = $("#inp_text").val().length;
 if ($txtLength > 10) {
  var url = $("#inp_text").val();
  var xx = url.match(RegExp("((news|telnet|nttp|file|http|ftp|https)://){1}(([-A-Za-z0-9]+(\\.[-A-Za-z0-9]+)*(\\.[-A-Za-z]{2,5}))|([0-9]{1,3}(\\.[0-9]{1,3}){3}))(:[0-9]*)?(/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*)*", "gi") || []);
  if (xx != null) {
   for (var i = 0; i < xx.length; i++) {
    var $txtLength = $("#inp_text").val().length;
    $txtLength = $txtLength - xx[i].length + 11;
   }
  }
 }
 if ($txtLength < 141) {
  $("#div_txtlength").html("还能输入<span>" + (140 - $txtLength) + "</span>个字");
 }
 else {
  $("#div_txtlength").html("超出<span>" + ($txtLength - 140) + "</span>个字");
 }
}
function InsertText() {
 if ($("#inp_text").val().Trim().length == 0) {
  art.dialog({
   title: '错误',
   icon: 'error',
   content: '请输入内容',
   width: "150px",
   height: "80px",
   lock: true
  });
  return;
 }
 //长url转换成短url
 var url = $("#inp_text").val();
 var xx = url.match(RegExp("((news|telnet|nttp|file|http|ftp|https)://){1}(([-A-Za-z0-9]+(\\.[-A-Za-z0-9]+)*(\\.[-A-Za-z]{2,5}))|([0-9]{1,3}(\\.[0-9]{1,3}){3}))(:[0-9]*)?(/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*)*", "gi") || []);
 var $txtLength = $("#inp_text").val().length;
 if (xx != null) {
  for (var i = 0; i < xx.length; i++) {
   $txtLength = $txtLength - xx[i].length + 11;
  }
 }
 if ($txtLength < 141) {
  $("#div_txtlength").html("还能输入<span>" + (140 - $txtLength) + "</span>个字");
 }
 else {
  $("#div_txtlength").html("超出<span>" + ($txtLength - 140) + "</span>个字");
 }
 if ($txtLength > 140) {
  art.dialog({
   title: '错误',
   icon: 'error',
   content: '字数超出限制',
   width: "150px",
   height: "80px",
   lock: true
  });
  return false;
 }
 $.ajax({
  type: "POST",
  url: "../MiniBlog/Handler.ashx",
  data: { "txt": $("#inp_text").val() },
  datatype: "html",
  beforeSend: function () { $("#div_txtlength").html("正在提交。。。"); },
  success: function (data) {
   if (data.length > 1) {
    window.location.reload();
   }
   else {
    art.dialog({
     title: '错误',
     icon: 'error',
     content: '发布失败,请复制内容后刷新当前页面。',
     width: "150px",
     height: "80px",
     lock: true
    });
   }
  },
  complete: function (XMLHttpRequest, textStatus) {
   //     alert(XMLHttpRequest.responseText);
   //     alert(textStatus);
  },
  error: function () {
  }
 });
}

二、前台ASPX的代码如下(部分)

<div class="title_left">
 有什么新鲜事和大家分享?</div>
<div class="left_box">
 <textarea class="textarea01" id="inp_text" onblur="CheckInput()" onkeyup="CheckInput()">
</textarea></div>
<div class="left_box">
 <div class="insert" style="visibility: hidden">
  <ul>
   <li style="background: url(../images/weibo/icon.jpg) no-repeat -172px 0px;">
<a href="#"> 表情</a></li>
   <li style="background: url(../images/weibo/icon.jpg) no-repeat -115px 0px;">
<a href="#"> 图片</a></li>
   <li style="background: url(../images/weibo/icon.jpg) no-repeat -229px 0px;">
<a href="#"> 音乐</a></li>
  </ul>
 </div>
 <div class="Prompt" id="div_txtlength">
  还能输入<span>140</span>字</div>
 <div class="bottom_gb">
  <a href="javascript:void(0)" onclick="InsertText();" class="link1"></a>
 </div>
</div>

三、以上是用来判断用户输入内容里面是否含有网址,下面是后台提交到数据库的时候进行的转换

#region 长url转短url
Regex rx = new Regex("((news|telnet|nttp|file|http|ftp|https)://){1}(([-A-Za-z0-9]+(\\.[-A-Za-z0-9]+)*(\\.[-A-Za-z]{2,5}))|([0-9]{1,3}(\\.[0-9]{1,3}){3}))(:[0-9]*)?(/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*)*", RegexOptions.IgnoreCase);
string txt_context = context.Request.Form["txt"].ToString();
MatchCollection mc = rx.Matches(txt_context);
if (mc.Count > 0)
{
   for (int i = 0; i < mc.Count; i++)
   {
    Haedu.Gxt.Model.MINIBLOGURL_Model M_url = new Haedu.Gxt.Model.MINIBLOGURL_Model();
    Haedu.Gxt.Bll.MINIBLOGURL B_url = new Haedu.Gxt.Bll.MINIBLOGURL();
    M_url.BACKUP1 = Common.md5(mc[i].Value);
    M_url.BACKUP2 = " ";
    M_url.CREATETIME = DateTime.Now;
    M_url.CREATEUSER = User_BaseInfo.GetUserID;
    M_url.ID = Common.GetGUID;
    M_url.STATE = 0;
    M_url.SURL = mc[0].Value;
    M_url.TURL = MiniBlog.ShortUrl(mc[i].Value);
    txt_context = txt_context.Replace(mc[i].Value, M_url.TURL); 

    if(!B_url.Exists(M_url.BACKUP1))
    {
     B_url.Add(M_url);
    }
   }
  }
#endregion
#region 写入微博数据库
--写入微博数据库的代码
#endregion

四、MiniBlog.ShortUrl方法代码

#region 长转短url
/// <summary>
/// 长url转短url
/// </summary>
/// <param name="url">原url</param>
/// <returns>返回短url</returns>
public static string ShortUrl(string url)
{
  //可以自定义生成MD5加密字符传前的混合KEY
  string key = "Haedu_MiniBlog";
  //要使用生成URL的字符
  string[] chars = new string[]{
    "a","b","c","d","e","f","g","h",
    "i","j","k","l","m","n","o","p",
    "q","r","s","t","u","v","w","x",
    "y","z","0","1","2","3","4","5",
    "6","7","8","9","A","B","C","D",
    "E","F","G","H","I","J","K","L",
    "M","N","O","P","Q","R","S","T",
    "U","V","W","X","Y","Z"};
  //对传入网址进行MD5加密
  string hex = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key + url, "md5");
  string[] resUrl = new string[4];
  for (int i = 0; i < 4; i++)
  {
   //把加密字符按照8位一组16进制与0x3FFFFFFF进行位与运算
   int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 8, 8), 16);
   string outChars = string.Empty;
   for (int j = 0; j < 6; j++)
   {
    //把得到的值与0x0000003D进行位与运算,取得字符数组chars索引
    int index = 0x0000003D & hexint;
    //把取得的字符相加
    outChars += chars[index];
    //每次循环按位右移5位
    hexint = hexint >> 5;
   }
   //把字符串存入对应索引的输出数组
   resUrl[i] = outChars;
  }
  return "http://url.cn/" + resUrl[(new Random()).Next(0, 3)];
}
#endregion

五、短URL转换成原始URL

#region 短url替换成原始url
public static string CheckUrl(string context)
{
  Regex rx = new Regex("((news|telnet|nttp|file|http|ftp|https)://){1}(([-A-Za-z0-9]+(\\.[-A-Za-z0-9]+)*(\\.[-A-Za-z]{2,5}))|([0-9]{1,3}(\\.[0-9]{1,3}){3}))(:[0-9]*)?(/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*)*", RegexOptions.IgnoreCase);
  MatchCollection mc = rx.Matches(context);
  if (mc.Count > 0)
  {
   for (int i = 0; i < mc.Count; i++)
   {
    Haedu.Gxt.Model.MINIBLOGURL_Model M_url = new Haedu.Gxt.Model.MINIBLOGURL_Model();
    Haedu.Gxt.Bll.MINIBLOGURL B_url = new Haedu.Gxt.Bll.MINIBLOGURL();
    M_url = B_url.GetModel(mc[i].Value);
    if (M_url != null)
    {
     if (int.Parse(M_url.STATE.ToString()) == 2)
     {
      context = context.Replace(mc[i].Value, "链接已经被屏蔽");
     }
     else
     {
      context = context.Replace(mc[i].Value, "<a href=\"" + M_url.SURL + "\" target=\"_blank\" title=\"" + M_url.SURL + "\" >" + mc[i].Value + "</a>");
     }
    }
   }
  }
  return context;
}
#endregion

六、数据库结构(oracle)

-- Create table
create table MINIBLOGURL
(
 id   VARCHAR2(50) not null,
 surl  VARCHAR2(200) not null,
 turl  VARCHAR2(100) not null,
 createtime DATE not null,
 createuser VARCHAR2(50) not null,
 state  NUMBER(1) not null,
 backup1 VARCHAR2(200) not null,
 backup2 VARCHAR2(200) not null
)
tablespace TAB_GXT
 pctfree 10
 initrans 1
 maxtrans 255
 storage
 (
 initial 64K
 next 8K
 minextents 1
 maxextents unlimited
 );
-- Add comments to the columns
comment on column MINIBLOGURL.id
 is '逻辑ID';
comment on column MINIBLOGURL.surl
 is '原始url';
comment on column MINIBLOGURL.turl
 is '转成的短url';
comment on column MINIBLOGURL.createtime
 is '创建时间';
comment on column MINIBLOGURL.createuser
 is '创建人ID';
comment on column MINIBLOGURL.state
 is '状态,0为认证的网址(比较知名的网站域名),1为未认证的网址(小网站),2为锁定不允许点击(广告类的网址)';
comment on column MINIBLOGURL.backup1
 is 'MD5值,用来比较网址是否已经存在';
comment on column MINIBLOGURL.backup2
 is '备用字段2';
-- Create/Recreate primary, unique and foreign key constraints
alter table MINIBLOGURL
 add constraint PK_ID primary key (ID)
 using index
 tablespace TAB_GXT
 pctfree 10
 initrans 2
 maxtrans 255
 storage
 (
 initial 64K
 next 1M
 minextents 1
 maxextents unlimited
 );
-- Create/Recreate indexes
create index IX_CREATEUSER on MINIBLOGURL (CREATEUSER)
 tablespace TAB_GXT
 pctfree 10
 initrans 2
 maxtrans 255
 storage
 (
 initial 64K
 next 1M
 minextents 1
 maxextents unlimited
 );
create unique index IX_MD5 on MINIBLOGURL (BACKUP1)
 tablespace TAB_GXT
 pctfree 10
 initrans 2
 maxtrans 255
 storage
 (
 initial 64K
 next 1M
 minextents 1
 maxextents unlimited
 );
create index IX_SURL on MINIBLOGURL (SURL)
 tablespace TAB_GXT
 pctfree 10
 initrans 2
 maxtrans 255
 storage
 (
 initial 64K
 next 1M
 minextents 1
 maxextents unlimited
 );
create index IX_TURL on MINIBLOGURL (TURL)
 tablespace TAB_GXT
 pctfree 10
 initrans 2
 maxtrans 255
 storage
 (
 initial 64K
 next 1M
 minextents 1
 maxextents unlimited
 );

至此,基于上面的代码即可完成微博的长短URL相互转换,具体应用的时候还需要自己进行调整修改。

希望本文所述对大家的C#程序设计有所帮助。

相关文章
  • C#实现类似新浪微博长URL转短地址的方法 2014-01-08

    这篇文章主要介绍了C#实现类似新浪微博长URL转短地址的方法,涉及C#操作正则表达式的相关技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#实现类似新浪微博长URL转短地址的方法.分享给大家供大家参考.具体如下: 一.前台判断用户输入URL的JS代码如下. function CheckInput() { var $txtLength = $("#inp_text").val().length; if ($txtLength > 10) { var url = $(&

  • js实现类似新浪微博首页内容渐显效果的方法 2015-04-09

    这篇文章主要介绍了js实现类似新浪微博首页内容渐显效果的方法,实例分析了渐显效果的实现要点与方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js实现类似新浪微博首页内容渐显效果的方法.分享给大家供大家参考.具体分析如下: 要点一: if(list_li.length>=1){ list.insertBefore(li,list_li[0]); }else{ list.appendChild(li); } 从在前面插入新内容,如果没有新内容,就是在后面插入新内容. 要点二: var h

  • asp.net获取URL和IP地址的方法汇总 2015-01-04

    asp.net获取URL和IP地址的方法汇总,需要的朋友可以参考一下 HttpContext.Current.Request.Url.ToString() 并不可靠. 如果当前URL为 http://localhost/search.aspx?user=http://csharp.xdowns.com&tag=%BC%BC%CA%F5 通过HttpContext.Current.Request.Url.ToString()获取到的却是 http://localhost/search.aspxus

  • URL短地址压缩算法 微博短地址原理解析 (Java实现) 2014-07-29

    最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷.同时还发现有不少网友在发帖求助,怎么实现Java版的短网址(ShortUrl)的算法.干脆一不做,二不休,参考了一下网上比较流行的PHP版短网址(ShortUrl)算法: 再根据自己的理解,用Java实现了该短网址(ShortUrl)的算法.(\(^o^)/YES!我还真厉害!) 先来废话一下,是在别人的

  • C# URL短地址压缩算法及短网址原理解析 2014-01-30

    这篇文章主要介绍了C# URL短地址压缩算法及短网址原理解析,本文重点给出了算法代码,需要的朋友可以参考下 短网址应用已经在全国各大微博上开始流行了起来.例如QQ微博的url.cn,新郎的sinaurl.cn等. 我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.cn/2hytQx 为什么要这样做的,原因我想有这样几点: 微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允

  • 微薄短地址的实现-python 2012-11-22

    几乎所有的微薄都提供了缩短网址的服务,其原理就是将一个url地址按照一定的算法生成一段字符串,然后加在一个短域名后面边成了一个新的url地址,数 据库中会存放这个短地址和原始的地址,当用户点击这个新的短地址后,短地址服务会根据短域名后面的几个字符串从数据库中读出原来的地址然后页面进行跳转 . 比如新浪微薄中的url 是 http://t.cn/xxxxxxx t.cn是其域名 ,其后面跟着的是7位算出来的字符串 http://www.guokr.com/question/297490/ 这个ur

  • socket长连接和短连接的区别 2012-07-20

    长连接与短连接的区别(tcp socket http概念原理是一样的) 一.长连接与短连接:长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收.这种方式下由于通讯连接一直存在.此种方式常用于P2P通信.短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接.此方式常用于一点对多点通讯.C/S通信.二.长连接与短连接的操作过程:短连接的操作步骤是:建立连接--数据传输--关闭连接...建立连接--数据传输--关闭

  • http长连接和短连接 2015-04-30

    HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如JavaScript文件.图像文件.CSS文件等:当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话 HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的.

  • php curl 获取google短地址问题解决 2012-11-13

    我们有个类微博应用 背景:测试员说其发表内容中链接应该是可点击的短链接 简单调试发现:在本地和服务器上都能获取到链接的短地址,唯独内网的测试地址: 192.168.1.111:81/app 不能获取短地址, 思考原因,获取短地址的流程是 匹配内容中的url,然后调用google的短址api, 首先我没有匹配出带端口号的url,没有匹配出localhost的url 就想偷懒直接匹配出以(http://|https://|ftp://)开头,至空格,引号(',",',",等隔断符,包含汉字

  • jQuery实现长按按钮触发事件的方法 2014-12-21

    这篇文章主要介绍了jQuery实现长按按钮触发事件的方法,可应用于手机端应用程序的开发中,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了jQuery实现长按按钮触发事件的方法.分享给大家供大家参考.具体分析如下: 现在手机端的快速发展,使许多手机手势需要制作到手机版的网页过程中 网上有许多长按按钮的插件,甚至仅仅是jQuery Mobile都有长按事件 但是基于种种的兼容性问题, 只使用jquery去实现长按动作,可以在手机端与电脑端保持极强的兼容性 一.基本目标 制作一个按钮,实质上一

  • 短地址生成器接口 ShortUrlApi 2013-11-13

    ShortUrlApi 网站 : http://git.oschina.net/myaniu/ShortUrlApi 短地址生成器接口,目前仅实现了网易126.am的短地址生成器接口. 以后会慢慢添加其他短地址服务提供商的实现. 如何使用: Am126ShortUrlGenerater sug = new Am126ShortUrlGenerater(); //这个apikey需要在126.am网站上申请. sug.setApiKey("b4df5122444bb4198387f09"

  • ASP.NET中URL Rewrite的具体实现方法 2013-11-17

    这篇文章介绍了ASP.NET中URL Rewrite的具体实现方法,有需要的朋友可以参考一下 之前觉得这个话题已经被谈滥了.URL Rewrite早已经被广大开发人员所接受,网上关于URL Rewrite的组件和文章也层出不穷,但是总是让我感觉意犹未尽,于是最终还是忍不住提笔写了这系列文章.这些文章不会谈论URL Rewrite的价值与意义,而只会谈论纯技术的内容.文章中也不会有详尽地实现分析,而是结合了我的经验,从应用角度来讲解这个话题.您已经知道的,您还不知道的,别处已经讲过的,或者还没有讲

  • JS获取几种URL地址的方法小结 2014-01-24

    本篇文章主要是对JS获取几种URL地址的方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 以下为JS获取几种URL地址的方法 thisURL = document.URL; thisHREF = document.location.href; thisSLoc = self.location.href; thisDLoc = document.location; thisTLoc = top.location.href; thisPLoc = parent.document.lo

  • C语言实现最长递增子序列问题的解决方法 2014-02-02

    这篇文章主要介绍了C语言实现最长递增子序列问题的解决方法,采用递归的方法解决该问题,是非常经典的一类算法,需要的朋友可以参考下 本文实例展示了C语言实现最长递增子序列问题的解决方法.分享给大家供大家参考.具体方法如下: 问题描述: 给定一个序列,找出其最长递增子序列长度. 比如 输入 1 3 7 5 输出 3 算法解决思路: 利用动态规划的思想,以序列的每个点最为最右端,找出每个点作为最右端时的子序列长度的最大值,即问题的求解.因此,在计算前面的每个点的时候,将其结果保存下来,后面的点与前面的点

  • js实现ifram取父窗口URL地址的方法 2014-04-18

    这篇文章主要介绍了js实现ifram取父窗口URL地址的方法,是javascript操作window.parent对象非常典型的应用技巧,需要的朋友可以参考下 本文实例讲述了js实现ifram取父窗口URL地址的方法.分享给大家供大家参考.具体实现方法如下: var url=''; try { url = window.top.document.referrer ; } catch(M) { if (window.parent) { try { url = window.parent.docum

  • php实现把url转换迅雷thunder资源下载地址的方法 2014-04-21

    这篇文章主要介绍了php实现把url转换迅雷thunder资源下载地址的方法,采用很简单的base64_encode编码即可实现该功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了php实现把url转换迅雷thunder资源下载地址的方法.分享给大家供大家参考.具体方法分析如下: 如果你知道迅雷地址的生成规则你就不觉得迅雷的url资源下载地址有多么复杂了, 其实雷的地址就是原url前面带AA后面带BB之后再base64_encode编码即可 如下例子所示: <?php function

  • 利用Python和OpenCV库将URL转换为OpenCV格式的方法 2014-05-02

    这篇文章主要介绍了利用Python和OpenCV库将URL转换为OpenCV格式的方法,同时用到了NumPy和urllib,需要的朋友可以参考下 今天的博客是直接来源于我自己的个人工具函数库. 过去几个月,有些PyImageSearch读者电邮问我:"如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)".这篇文章我将展示一下怎么实现这个功能. 额外的,我们也会看到如何利用scikit-image从URL下载一幅图像.当然前行之路也会有一个常见的错误,它可能让

  • PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部 2014-05-31

    PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部 ,需要的朋友可以参考下. <?php function ff_page($content,$page) { global $expert_id; $PageLength = 2000; //每页字数 $CLength = strlen($content); $PageCount = floor(($CLength / $PageLength)) + 1; //计算页数 $PageArray=array(); $Seperator =

  • php解析字符串里所有URL地址的方法 2014-07-24

    这篇文章主要介绍了php解析字符串里所有URL地址的方法,涉及php操作数组.字符串及URL的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php解析字符串里所有URL地址的方法.分享给大家供大家参考.具体如下: <?php // $html = the html on the page // $current_url = the full url that the html came from //(only needed for $repath) // $repath =

  • php实现根据url自动生成缩略图的方法 2014-08-11

    这篇文章主要介绍了php实现根据url自动生成缩略图的方法,详细讲述了相关库的使用.配置文件写法及类文件的用法示例,需要的朋友可以参考下 本文实例讲述了php实现根据url自动生成缩略图的方法,是非常实用的功能.分享给大家供大家参考.具体方法如下: 原理:设置apache rewrite ,当图片不存在时,调用php创建图片. 例如: 原图路径为:http://localhost/upload/news/2013/07/21/1.jpg 缩略图路径为:http://localhost/suplo