=波波日志 > Asp.Net/C#/WCF > C#实现的html内容截取=
C#实现的html内容截取
C#实现的html内容截断,得到文章列表中的摘要信息。一般博客的首页只显示文章的摘要,点击标题进入以后查看全文。
下面是C#实现的html内容截断,获取html文章内容的摘要。效果还可以。效果参看web编程网。
/// <summary>
/// 删除标签
/// </summary>
/// <param name="tags"></param>
/// <param name="tag"></param>
private static void RemoveTag(List<string> tags, string tag)
{
for (int i = tags.Count - 1; i >= 0; i--) if (tags[i].IndexOf(tag) == 1) { tags.RemoveAt(i); break; }
}
/// <summary>
/// 按文本内容长度截取HTML字符串(支持截取带HTML代码样式的字符串)
/// </summary>
/// <param name="html">将要截取的字符串参数</param>
/// <param name="len">截取的字节长度</param>
/// <param name="endString">字符串末尾补上的字符串</param>
/// <returns>返回截取后的字符串</returns>
public static string HTMLSubstring(string html, int len, string endString)
{
if (string.IsNullOrEmpty(html) || html.Length <= len) return html;
MatchCollection mcentiry, mchtmlTag;
List<string> inputHTMLTag = new List<string>();
string r = "", tmpValue, nowtag, losetag;
int rWordCount = 0, wordNum = 0, i = 0;
Regex rxSingle = new Regex("^<(br|hr|img|input|param|meta|link|wbr)", RegexOptions.Compiled | RegexOptions.IgnoreCase)//是否单标签正则
, rxEndTag = new Regex("</[^>]+>", RegexOptions.Compiled)//是否结束标签正则
, rxTagName = new Regex("</?([a-z\\d]+)[^>]*>", RegexOptions.Compiled | RegexOptions.IgnoreCase)//获取标签名正则
, rxHtmlTag = new Regex("<[^>]+>", RegexOptions.Compiled)//html标签正则
, rxEntity = new Regex("&[a-z]{1,9};", RegexOptions.Compiled | RegexOptions.IgnoreCase)//实体正则
, rxEntityReverse = new Regex("§", RegexOptions.Compiled)//反向替换实体正则
;
html = html.Replace("§", "§");//替换字符§为他的实体“§”,以便进行下一步替换
mcentiry = rxEntity.Matches(html);//收集实体对象到匹配数组中
html = rxEntity.Replace(html, "§");//替换实体为特殊字符§,这样好控制一个实体占用一个字符
mchtmlTag = rxHtmlTag.Matches(html);//收集html标签到匹配数组中
string[] arrWord = rxHtmlTag.Split(html);//拆分
wordNum = arrWord.Length;
//获取指定内容长度及HTML标签
for (; i < wordNum; i++)
{
if (rWordCount + arrWord[i].Length >= len) r += arrWord[i].Substring(0, len - rWordCount) + endString;
else r += arrWord[i];
rWordCount += arrWord[i].Length;//计算已经获取到的字符长度
if (rWordCount >= len) break;
//搜集已经添加的非单标签,以便封闭HTML标签对
if (i < wordNum - 1)
{
tmpValue = mchtmlTag[i].Value.ToLower();
if (!rxSingle.IsMatch(tmpValue))
{ //不是单标签
if (rxEndTag.IsMatch(tmpValue) && inputHTMLTag.Count > 0)
{//这里注意区分结束标签是否和最近一次加入的标签匹配
nowtag = rxTagName.Match(tmpValue).Groups[1].Value.ToLower();
losetag = rxTagName.Match(inputHTMLTag[inputHTMLTag.Count - 1]).Groups[1].Value.ToLower();
inputHTMLTag.RemoveAt(inputHTMLTag.Count - 1);
if (nowtag != losetag)
{
RemoveTag(inputHTMLTag, nowtag);
r += "</" + losetag + ">";//补全丢失的标签
}
}
else inputHTMLTag.Add(tmpValue);
}
r += tmpValue;
}
}
//替换回实体
for (i = 0; i < mcentiry.Count; i++) r = rxEntityReverse.Replace(r, mcentiry[i].Value, 1);
//封闭标签
for (i = inputHTMLTag.Count - 1; i >= 0; i--) r += "</" + rxTagName.Match(inputHTMLTag[i].ToString()).Groups[1].Value + ">";
return r;
}
相关文章
类别:Asp.Net/C#/WCF 作者:波波 日期:2012-02-07 【评论:0】
相关文章
暂时没有评论!
发表留言
热门博文
- IE里Cookie跨域不能读取
- web服务因URL意外地以/**结束,请求格式无法识别
- 去掉隐藏asp.net编译出错aspxerrorpath错误参数
- 解决asp.net验证视图状态 MAC 失败
- 找不到System.Web.Script.Services.ScriptService
- 在aspx,ashx页面挂起线程执行
最新博文
- WCF授权-通过扩展自行实现服务授权
- WCF授权-ASP.NET Roles授权[下篇]
- WCF授权-ASP.NET Roles授权[上篇]
- WCF授权-模拟在WCF中的应用
- WCF授权-模拟(Impersonation)与委托(Delegation)
- WCF授权-基于Windows用户组授权[下篇]
随机博文
- 防止.NET木马列所有站物理路径,防止.JPG类型木马
- C# GUID ToString参数格式
- 正则表达式过滤HTML危险脚本
- .net使用Memcached简介
- 使用WMI来控制Windows目录
- WCF底层异常处理框架实现原理一
广告商赞助

