C#实现的html内容截取

原创 2012年02月09日 16:44:30
C#实现的html内容截断,得到文章列表中的摘要信息。一般博客的首页只显示文章的摘要,点击标题进入以后查看全文。

  下面是C#实现的html内容截断,获取html文章内容的摘要。效果还可以。

/// <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;
            ArrayList inputHTMLTag = new ArrayList();
            string r = "",tmpValue;
            int rWordCount = 0, wordNum = 0, i = 0;
            Regex rxSingle = new Regex("^<(br|hr|img|input|param|meta|link)", RegexOptions.Compiled | RegexOptions.IgnoreCase)//是否单标签正则
                , rxEndTag = new Regex("</[^>]+>", RegexOptions.Compiled)//是否结束标签正则
                , rxTagName = new Regex("<([a-z]+)[^>]*>", 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标签到匹配数组中
            html = rxHtmlTag.Replace(html, "__HTMLTag__");//替换为特殊标签
            string []arrWord = html.Split(new string[] { "__HTMLTag__" }, StringSplitOptions.None);//通过特殊标签进行拆分
            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;
                    if (!rxSingle.IsMatch(tmpValue))
                    { //不是单标签
                        if (rxEndTag.IsMatch(tmpValue)&&inputHTMLTag.Count>0) inputHTMLTag.RemoveAt(inputHTMLTag.Count - 1);
                        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;
        }

     

相关文章

javascript实现html内容截断得到摘要


来源:http://www.w3dev.cn/article/20120207/csharp-cut-off-html-content.aspx


C# 取出HTML里面的文字

public static string StripHTML(string strHtml) { string[] aryReg ={ @"...
  • qq_23502409
  • qq_23502409
  • 2017年06月26日 15:43
  • 268

php截取html摘要,自动检查html标签闭合

日志一般需要生成摘要,手动填写太麻烦,于是使用mb_substr自动截取,问题来了。如果纯文本还基本准确,要是html代码过多,截取出来的差得太 多。比如设定摘要300字,前面空格、html代码就可能...
  • myweishanli
  • myweishanli
  • 2014年05月27日 14:53
  • 565

js去掉html标记,去掉字符,截取字符

1,得到网页上的链接地址:       string matchString = @"]+href=\s*(?:'(?[^']+)'|""(?[^""]+)""|(?[^>\s]+))\s*[^...
  • fanzhigang0
  • fanzhigang0
  • 2013年04月10日 10:52
  • 1815

用纯C#实现截取屏幕指定区域

以前在别的地方见过一个通过调用系统API实现屏幕截图的例子,从内心来说我不太喜欢在C#代码中出现这种情况,现在什么都讲“和谐”,我觉得这种做法就是破坏了我们的“和谐”代码,呵呵,开玩笑,有的时候,不通...
  • zhoufoxcn
  • zhoufoxcn
  • 2008年03月22日 15:04
  • 9332

获取html网页中的body部分内容

1.导入htmlparser.jar架包 2./**      * 获取HTML页面中BODY标签的内容      * @param inputHTML      *      * @re...
  • hedan_hd
  • hedan_hd
  • 2012年09月21日 16:49
  • 3971

PHP 正则表达式截取HTML

用php的正则表达式相关函数,实现提取html超链接中的地址。 代码如下 复制代码 $preg='//is'; $str ='URLNAME文本段1URLNAME文本段2URLNAME...
  • w_j_w2010
  • w_j_w2010
  • 2015年11月24日 10:07
  • 1229

html截取显示部分的img图片

html截取显示部分的img图片
  • kerryqpw
  • kerryqpw
  • 2017年09月06日 19:03
  • 474

jsp/java截取截断html内容的方法与技巧

http://www.iteye.com/topic/730396 package com.tools; import java.util.ArrayList; import...
  • chruan
  • chruan
  • 2012年03月01日 17:18
  • 1292

C# 获取指定HTML网页中的标签内容

首先获取网页内容:   HttpClient client = new HttpClient(); var Result= client.GetStringAsync("http://www.b...
  • a123_z
  • a123_z
  • 2017年06月27日 14:25
  • 2011

java实现带HTML代码的文章摘要截取

不知大家是否已经注意到个人知客首页和列表页的文章已经实现了部分摘要内容的显示呢?这个看似简单的功能其实给我添了不少麻烦的说,前几天终于解决了,现在和大家一起分享一下经验,嘿嘿~~  普通的纯文本文字截...
  • cngkqy
  • cngkqy
  • 2008年01月17日 10:43
  • 10932
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#实现的html内容截取
举报原因:
原因补充:

(最多只允许输入30个字)