C#实现类似新浪微博长URL转短地址的方法
本文实例讲述了C#实现类似新浪微博长URL转短地址的方法。分享给大家供大家参考。具体如下:
一、前台判断用户输入URL的JS代码如下。
functionCheckInput(){
var$txtLength=$("#inp_text").val().length;
if($txtLength>10){
varurl=$("#inp_text").val();
varxx=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(vari=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>个字");
}
}
functionInsertText(){
if($("#inp_text").val().Trim().length==0){
art.dialog({
title:'错误',
icon:'error',
content:'请输入内容',
width:"150px",
height:"80px",
lock:true
});
return;
}
//长url转换成短url
varurl=$("#inp_text").val();
varxx=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(vari=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
});
returnfalse;
}
$.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的代码如下(部分)
<divclass="title_left"> 有什么新鲜事和大家分享?</div> <divclass="left_box"> <textareaclass="textarea01"id="inp_text"onblur="CheckInput()"onkeyup="CheckInput()"> </textarea></div> <divclass="left_box"> <divclass="insert"style="visibility:hidden"> <ul> <listyle="background:url(../images/weibo/icon.jpg)no-repeat-172px0px;"> <ahref="#">表情</a></li> <listyle="background:url(../images/weibo/icon.jpg)no-repeat-115px0px;"> <ahref="#">图片</a></li> <listyle="background:url(../images/weibo/icon.jpg)no-repeat-229px0px;"> <ahref="#">音乐</a></li> </ul> </div> <divclass="Prompt"id="div_txtlength"> 还能输入<span>140</span>字</div> <divclass="bottom_gb"> <ahref="javascript:void(0)"onclick="InsertText();"class="link1"></a> </div> </div>
三、以上是用来判断用户输入内容里面是否含有网址,下面是后台提交到数据库的时候进行的转换
#region长url转短url
Regexrx=newRegex("((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);
stringtxt_context=context.Request.Form["txt"].ToString();
MatchCollectionmc=rx.Matches(txt_context);
if(mc.Count>0)
{
for(inti=0;i<mc.Count;i++)
{
Haedu.Gxt.Model.MINIBLOGURL_ModelM_url=newHaedu.Gxt.Model.MINIBLOGURL_Model();
Haedu.Gxt.Bll.MINIBLOGURLB_url=newHaedu.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>
///<paramname="url">原url</param>
///<returns>返回短url</returns>
publicstaticstringShortUrl(stringurl)
{
//可以自定义生成MD5加密字符传前的混合KEY
stringkey="Haedu_MiniBlog";
//要使用生成URL的字符
string[]chars=newstring[]{
"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加密
stringhex=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key+url,"md5");
string[]resUrl=newstring[4];
for(inti=0;i<4;i++)
{
//把加密字符按照8位一组16进制与0x3FFFFFFF进行位与运算
inthexint=0x3FFFFFFF&Convert.ToInt32("0x"+hex.Substring(i*8,8),16);
stringoutChars=string.Empty;
for(intj=0;j<6;j++)
{
//把得到的值与0x0000003D进行位与运算,取得字符数组chars索引
intindex=0x0000003D&hexint;
//把取得的字符相加
outChars+=chars[index];
//每次循环按位右移5位
hexint=hexint>>5;
}
//把字符串存入对应索引的输出数组
resUrl[i]=outChars;
}
return"http://url.cn/"+resUrl[(newRandom()).Next(0,3)];
}
#endregion
五、短URL转换成原始URL
#region短url替换成原始url
publicstaticstringCheckUrl(stringcontext)
{
Regexrx=newRegex("((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);
MatchCollectionmc=rx.Matches(context);
if(mc.Count>0)
{
for(inti=0;i<mc.Count;i++)
{
Haedu.Gxt.Model.MINIBLOGURL_ModelM_url=newHaedu.Gxt.Model.MINIBLOGURL_Model();
Haedu.Gxt.Bll.MINIBLOGURLB_url=newHaedu.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,"<ahref=\""+M_url.SURL+"\"target=\"_blank\"title=\""+M_url.SURL+"\">"+mc[i].Value+"</a>");
}
}
}
}
returncontext;
}
#endregion
六、数据库结构(oracle)
--Createtable createtableMINIBLOGURL ( idVARCHAR2(50)notnull, surlVARCHAR2(200)notnull, turlVARCHAR2(100)notnull, createtimeDATEnotnull, createuserVARCHAR2(50)notnull, stateNUMBER(1)notnull, backup1VARCHAR2(200)notnull, backup2VARCHAR2(200)notnull ) tablespaceTAB_GXT pctfree10 initrans1 maxtrans255 storage ( initial64K next8K minextents1 maxextentsunlimited ); --Addcommentstothecolumns commentoncolumnMINIBLOGURL.id is'逻辑ID'; commentoncolumnMINIBLOGURL.surl is'原始url'; commentoncolumnMINIBLOGURL.turl is'转成的短url'; commentoncolumnMINIBLOGURL.createtime is'创建时间'; commentoncolumnMINIBLOGURL.createuser is'创建人ID'; commentoncolumnMINIBLOGURL.state is'状态,0为认证的网址(比较知名的网站域名),1为未认证的网址(小网站),2为锁定不允许点击(广告类的网址)'; commentoncolumnMINIBLOGURL.backup1 is'MD5值,用来比较网址是否已经存在'; commentoncolumnMINIBLOGURL.backup2 is'备用字段2'; --Create/Recreateprimary,uniqueandforeignkeyconstraints altertableMINIBLOGURL addconstraintPK_IDprimarykey(ID) usingindex tablespaceTAB_GXT pctfree10 initrans2 maxtrans255 storage ( initial64K next1M minextents1 maxextentsunlimited ); --Create/Recreateindexes createindexIX_CREATEUSERonMINIBLOGURL(CREATEUSER) tablespaceTAB_GXT pctfree10 initrans2 maxtrans255 storage ( initial64K next1M minextents1 maxextentsunlimited ); createuniqueindexIX_MD5onMINIBLOGURL(BACKUP1) tablespaceTAB_GXT pctfree10 initrans2 maxtrans255 storage ( initial64K next1M minextents1 maxextentsunlimited ); createindexIX_SURLonMINIBLOGURL(SURL) tablespaceTAB_GXT pctfree10 initrans2 maxtrans255 storage ( initial64K next1M minextents1 maxextentsunlimited ); createindexIX_TURLonMINIBLOGURL(TURL) tablespaceTAB_GXT pctfree10 initrans2 maxtrans255 storage ( initial64K next1M minextents1 maxextentsunlimited );
至此,基于上面的代码即可完成微博的长短URL相互转换,具体应用的时候还需要自己进行调整修改。
希望本文所述对大家的C#程序设计有所帮助。