2009年3月27日23:52:20更新

最近网站要做静态生成内容必须分页所以在网上找了N多实例都不理想,所以花了点时间自己写了个方法

目前来说没发现什么问题(已用方法生成20W以上的html)

所以把代码贴出来与大家分享。

不足之处或有更好的方法请大家告知我不胜感激。

调用ArrayList arrlt=ContentPage.GetPageContent("分页内容", 分页大小,true);

Code
using System;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;

namespace Common
{
    /**//// <summary>
    /// 内容分页 v0.1.2
    /// http://cn795.cnblogs.com
    /// </summary>
    public class ContentPage
    {
        /**//// <summary>
        /// 内容分页
        /// </summary>
        /// <param name="strContent">要分页的字符串内容</param>
        /// <param name="intPageSize">分页大小</param>
        /// <param name="isOpen">最后一页字符小于intPageSize的1/4加到上一页</param>
        /// <returns></returns>
        public static ArrayList GetPageContent(string strContent, int intPageSize, bool isOpen)
        {
            ArrayList arrlist = new ArrayList();
            string strp = strContent;
            int num = RemoveHtml(strp.ToString()).Length;//除html标记后的字符长度
            int bp = (intPageSize + (intPageSize / 5));

            for (int i = 0; i < ((num % bp == 0) ? (num / bp) : ((num / bp) + 1)); i++)
            {
                arrlist.Add(SubString(intPageSize, ref strp));
                num = RemoveHtml(strp.ToString()).Length;
                if (isOpen && num < (intPageSize / 4))
                { // 小于分页1/4字符加到上一页
                    arrlist[arrlist.Count - 1] = arrlist[arrlist.Count - 1] + strp;
                    strp = "";
                }
                i = 0;
            }
            if (strp.Length > 0) arrlist.Add(strp);  //大于1/4字符 小于intPageSize 

            return arrlist;
        }

        /**//// <summary>
        /// &lt; 符号搜索
        /// </summary>
        /// <param name="cr"></param>
        /// <returns></returns>
        private static bool IsBegin(char cr)
        {
            return cr.Equals('<');
        }

        /**//// <summary>
        /// &gt;  符号搜索
        /// </summary>
        /// <param name="cr"></param>
        /// <returns></returns>
        private static bool IsEnd(char cr)
        {
            return cr.Equals('>');
        }

        /**//// <summary>
        /// 截取分页内容
        /// </summary>
        /// <param name="index">每页字符长度</param>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string SubString(int index, ref string str)
        {
            ArrayList arrlistB = new ArrayList();
            ArrayList arrlistE = new ArrayList();
            string strTag = "";
            char strend = '0';
            bool isBg = false;
            bool IsSuEndTag = false;

            index = Gindex(str, index);
            string substr = CutString(str, 0, index);  //截取分页长度
            string substr1 = CutString(str, index, str.Length - substr.Length); //剩余字符
            int iof = substr.LastIndexOf("<"), iof1 = 0;

            防止标记截断#region 防止标记截断

            if (iof > 0) iof1 = CutString(substr, iof, substr.Length - iof).IndexOf(">"); // 标记是否被截断
            if (iof1 < 0) //完整标记被截断,则重新截取
            {
                index = index + substr1.IndexOf(">") + 1;
                substr = CutString(str, 0, index);
                substr1 = CutString(str, index, str.Length - substr.Length);
            }

            int indexendtb = substr.LastIndexOf("</tr>");
            if (indexendtb >= 0)
            {
                substr = CutString(str, 0, indexendtb);
                substr1 = CutString(str, indexendtb, str.Length - indexendtb);
            }

            int intsubstr = substr.LastIndexOf("/>") + 1;
            int intsubstr1 = substr1.IndexOf("</");
            if (intsubstr >= 0 && intsubstr1 >= 0)   // <xx /> 标记与  </xx>结束标记间是否字符  如:<a href="#"><img src="abc.jpg" />文字文字文字文字</a>
            {
                string substr2 = CutString(substr, intsubstr, substr.Length - intsubstr) + CutString(substr1, 0, intsubstr1);
                if (substr2.IndexOf('>') == -1 && substr2.IndexOf('<') == -1)   // 
                {
                    substr += CutString(substr1, 0, intsubstr1);
                    substr2 = CutString(substr1, intsubstr1, substr1.Length - intsubstr1);
                    int sub2idf = substr2.IndexOf('>');
                    substr += CutString(substr2, 0, sub2idf);
                    substr1 = CutString(substr2, sub2idf, substr2.Length - sub2idf);
                }
            }
            #endregion

            //分析截取字符内容提取标记
            foreach (char cr in substr)
            {
                if (IsBegin(cr)) isBg = true;
                if (isBg) strTag += cr;

                if (isBg && cr.Equals('/') && strend.Equals('<')) IsSuEndTag = true;

                if (IsEnd(cr))
                {
                    if (strend.Equals('/')) //跳出 <XX />标记
                    {
                        isBg = false;
                        IsSuEndTag = false;
                        strTag = "";
                    }

                    if (isBg)
                    {
                        if (!CutString(strTag.ToLower(), 0, 3).Equals("<br"))
                        {
                            if (IsSuEndTag)
                                arrlistE.Add(strTag);  //结束标记
                            else
                                arrlistB.Add(strTag);  //开始标记
                        }
                        IsSuEndTag = false;
                        strTag = "";
                        isBg = false;
                    }
                }
                strend = cr;
            }

            //找到未关闭标记
            for (int b = 0; b < arrlistB.Count; b++)
            {
                for (int e = 0; e < arrlistE.Count; e++)
                {
                    string strb = arrlistB[b].ToString().ToLower();
                    int num = strb.IndexOf(' ');
                    if (num > 0) strb = CutString(strb, 0, num) + ">";
                    if (strb.ToLower().Replace("<", "</").Equals(arrlistE[e].ToString().ToLower()))
                    {
                        arrlistB.RemoveAt(b);
                        arrlistE.RemoveAt(e);
                        b = -1;
                        break;
                    }
                }
            }

            //关闭被截断标记
            for (int i = arrlistB.Count; i > 0; i--)
            {
                string stral = arrlistB[i - 1].ToString();
                substr += (stral.IndexOf(" ") == -1 ? stral.Replace("<", "</") : CutString(stral, 0, stral.IndexOf(" ")).Replace("<", "</") + ">");
            }
            //补全上页截断的标签
            string strtag = "";
            for (int i = 0; i < arrlistB.Count; i++) strtag += arrlistB[i].ToString();

            str = strtag + substr1; //更改原始字符串
            return substr; //返回截取内容
        }

        /**//// <summary>
        /// 返回真实字符长度
         /// </summary>
        /// <param name="str"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private static int Gindex(string str, int index)
        {
            bool isBg = false;
            bool isSuEndTag = false;
            bool isNbsp = false,isRnbsp=false;;
            string strnbsp="";
            int i = 0, c = 0;
            foreach (char cr in str)
            {
                if (!isBg && IsBegin(cr)) { isBg = true; isSuEndTag = false; }
                if (isBg && IsEnd(cr)) { isBg = false; isSuEndTag = true; }
               
                if (isSuEndTag && !isBg) //不在html标记内
                
                    if (cr.Equals('&')) isNbsp = true;
                    if (isNbsp)
                    {
                        strnbsp += cr.ToString();
                        if (strnbsp.Length > "&nbsp;".Length) { isNbsp = false; strnbsp = ""; }
                        if (cr.Equals(';')) isNbsp = false;//
                    }
                    if (!isNbsp && !"".Equals(strnbsp)) isRnbsp = strnbsp.ToLower().Equals("&nbsp;");
                }

                if ((isSuEndTag || (!isBg && !isSuEndTag)) && !cr.Equals('\n') && !cr.Equals('\r') && !cr.Equals(' ')) { c++; }

                if (isRnbsp) { c = c - 6; isRnbsp = false; strnbsp = ""; }

                i++;

                if (c == index) return i;
            }
            return i;
        }

        /**//// <summary>
        /// 移除Html标记
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        public static string RemoveHtml(string content)
        {
             content=Regex.Replace(content, @"<[^>]*>", string.Empty, RegexOptions.IgnoreCase);
             return Regex.Replace(content, "&nbsp;", string.Empty, RegexOptions.IgnoreCase);
        }

        /**//// <summary>
        /// 从字符串的指定位置截取指定长度的子字符串
        /// </summary>
        /// <param name="str">原字符串</param>
        /// <param name="startIndex">子字符串的起始位置</param>
        /// <param name="length">子字符串的长度</param>
        /// <returns>子字符串</returns>
        public static string CutString(string str, int startIndex, int length)
        {
            if (startIndex >= 0)
            {
                if (length < 0)
                {
                    length = length * -1;
                    if (startIndex - length < 0)
                    {
                        length = startIndex;
                        startIndex = 0;
                    }
                   else
                    {
                        startIndex = startIndex - length;
                    }
                }

                if (startIndex > str.Length) return "";

            }
            else
            {
                if (length < 0)
                {
                    return "";
                }
                else
                {
                    if (length + startIndex > 0)
                   {
                        length = length + startIndex;
                        startIndex = 0;
                    }
                    else
                    {
                        return "";
                    }
                }
            }

            if (str.Length - startIndex < length) length = str.Length - startIndex;

            try
            {
                return str.Substring(startIndex, length);
            }
            catch
            {
                return str;
            }
        }
    }
}

转载请注明出处:http://www.cnblogs.com/cn795
http://www.coode.cn/

转载于:https://www.cnblogs.com/dajiang02/archive/2010/09/29/1838611.html

含HTML标记的内容分页 (C#)相关推荐

  1. PHP新闻内容分页类

    最近要实现一个PHP新闻内容分页类,找了老半天竟然找不到满意的东东,根据一些网友提供的思想,自己动手写了个内容分页类.贴在这里各位PHPer交流一下,给些意见! 类可保存为content2page.c ...

  2. 文章内容分页采集方法-免费采集器

    采集数据时遇到文章的内容分成多页显示,我们要怎么采集呢? 我们可以使用免费采集器来设置,将有翻页的内容重新合并成一篇文章即可. 目录 1. 分页配置 2. 分页高级设置(可选) 1. 分页配置 在简数 ...

  3. 分页插件php,文章内容分页插件

    应用信息 名称: 文章内容分页插件 售价: 128元 应用ID: NextPage 最低要求: Z-BlogPHP 1.5.2.1935 (Zero) Build 151935 版 本: 6.1 发布 ...

  4. php分页功能乱码了怎么办,51、PHP文件内容分页操作,避免乱码

    新浪等一些大平台新闻网站经常使用内容分页技术,把一篇文章分成若干部分,每一部分作为其中一页,以这种形式展现给用户,不仅提升了用户体验,也提高了网站加载内容的效率,但是这种做法最大的问题就是在截取字符串 ...

  5. 帝国cms搜索php分页,帝国cms V7.2自定义分页(列表分页,内容分页)样式步骤

    [1]自己修改帝国cms默认的分页样式(css),这样做的好处是你不用去改动帝国的核心文件,方便以后升级. [2]自己动手去修改帝国的分页(php+css),帝国的分页在e>class>下 ...

  6. 文章内容分页功能实现

    文章内容分页,一篇文章内容过长,我们考虑内容分页显示.对于这个要求,得先从数据库设计角度来说,应该是一对多的关系.因此你需要设计两张表来存储文章的信息,第一张是基本的,如标题,摘要,作者等字段.另一个 ...

  7. php分页类smary,php新闻内容分页实例(smarty 模板)

    项目需要用到 新闻内容页 实现分页功能,随便写了一下. 给大家做个参考,写的不好还望谅解啊! //新闻内容分页开始 The page next for news content start $next ...

  8. MIME媒体类型:简介,作用(描述并标记多媒体内容),示例

    **MIME媒体类型(简称MIME类型)**是描述报文实体主体内容的一些标准化名称(比如,text/html.image/jpeg). 因特网有数千种不同的数据类型,HTTP仔细地给每种要通过web传 ...

  9. 文章,记录按内容分页显示,根据文章内容按字数进行分页(转)

    在很多时候我们对一些文章很长时,往往浏览时用鼠标滑来滑去非常麻烦.要是我们对这篇文章划分为几个 页面,用不同的面页去浏览不但看起来很爽,而且效率方面也是大的提高了. 下面是一段代码,给大家做个参考: ...

最新文章

  1. struct stat结构体的详解和用法
  2. 双数组Trie树(DoubleArrayTrie)Java实现
  3. vsftpd的基于pam_mysql的虚拟用户机制
  4. homepod怎么设置为中文_设置 HomePod
  5. Android内存管理机制详解,【安卓知识普及贴】之关于安卓内存管理机制的一些介绍和阐述。...
  6. Android HTTP POST上传
  7. 前端学习(774):查文档
  8. mysql -b -e_MySQL 的B+树索引.
  9. Python实例讲解 -- 操作数据库 附mysqldb win32 py2.7下载
  10. Oracle中查询rownum和rowid的区别
  11. QTP11 5 HP UFT 11 5 下载地址
  12. poj2236 并查集
  13. 给大家推荐12款好用的3D编辑器
  14. 微信公众号html教程,公众号排版简易教程
  15. 【服务器数据恢复】服务器误删除ESXi虚拟机的数据恢复案例
  16. 爷青回!最近很火的朋友圈怀旧小电视源码来啦!看到最后一个视频我大呼好家伙!
  17. Android--BroadcastReceiver
  18. mysql聚类函数排序_聚类算法大盘点 - 如鱼饮水,冷暖自知 - OSCHINA - 中文开源技术交流社区...
  19. 【线性代数】5-3:克莱姆法则,逆和体积(Cramers Rule,Inverses,and Volumes)
  20. 汇编学习教程:bx的作用

热门文章

  1. c语言删除链表中特定元素,Leetcode203. 删除链表中的元素_C语言
  2. java+web提交sumbit,jsp怎么让submit不提交
  3. 让电脑清空数据或死机,一定要执行才舒服
  4. centos识别移动硬盘U盘,需安装【ntfs-3g】
  5. linux java php_Linux PHP 搭建 JavaBridge
  6. cdh中hue集成hbase_HBase版本 | Cloudera Enterprise 6.2.0发布
  7. php js后端渲染,webpack后端渲染详解
  8. 建立efi分区_电脑维修不求人之几条命令无损增加分区的方法
  9. 计算机算法设计与分析 租用游艇问题
  10. Python读取word文档(python-docx包)