CSDN-CSDN社区-.NET技术-ASP.NET

收藏 有HTML标识的文章自动分页问题[问题点数:100,无满意答案结帖,结帖人:lansewoxin]

  • lansewoxin
  • (lansewoxin)
  • 等 级:
  • 结帖率:
楼主发表于:2009-01-10 00:30:06
有HTML标识的文章自动分页问题:
用到如:Freetextbox,FckEiditer,eWebEditer
这些工具来编辑文章,写入数据库.

目标,如果将长文章自动分页!
救救可怜的人吧!
回复次数:22
#1楼 得分:0回复于:2009-01-10 02:34:30
帮顶,学习哈
  • wangping_li用户头像
  • wangping_li
  • (总有一天,我星球上的人会来接我)
  • 等 级:
#2楼 得分:0回复于:2009-01-10 03:25:46
写入数据库分页?还是读出来显示的时候呢?
  • glt3260053用户头像
  • glt3260053
  • (云海之上(纳兰圣宗))
  • 等 级:
#3楼 得分:0回复于:2009-01-10 08:34:16
帮顶,学习哈
  • hy_lihuan用户头像
  • hy_lihuan
  • (罗嗦,努力的赚奶粉钱)
  • 等 级:
#4楼 得分:0回复于:2009-01-10 08:35:54
有标示还怎么分页阿?
#5楼 得分:0回复于:2009-01-10 08:42:02
帮顶,学习
#6楼 得分:0回复于:2009-01-10 10:28:04
编辑的时候插入分页符,服务端Split进行分页,

自动分页效果很差并且比较麻烦
  • gongsun用户头像
  • gongsun
  • (看看天空的白云)
  • 等 级:
#7楼 得分:0回复于:2009-01-10 10:46:09
引用 4 楼 hy_lihuan 的回复:
有标示还怎么分页阿?


只能split了。
#8楼 得分:0回复于:2009-01-10 10:53:55
要分页的地方插入一个手动插入NextPage

在服务器短就可以用下面的方法分开了
string[] resultString = Regex.Split(ass, "NextPage", RegexOptions.IgnoreCase);
#9楼 得分:0回复于:2009-01-10 10:54:58
要分页的地方插入一个手动插入NextPage

在服务器短就可以用下面的方法分开了
string[] resultString = Regex.Split(“整个内容。。。。”, "NextPage", RegexOptions.IgnoreCase);
#10楼 得分:0回复于:2009-01-10 11:09:11
HTML静态页面,分页很难
  • zzxap用户头像
  • zzxap
  • (风语者)
  • 等 级:
  • 2

#11楼 得分:0回复于:2009-01-10 11:18:57
public string NoHTML(string Htmlstring) //去除HTML标记
    {
        //删除脚本
        Htmlstring = Regex.Replace(Htmlstring, @" <script[^>]*?>.*? </script>", "", RegexOptions.IgnoreCase);
        //删除HTML
        Htmlstring = Regex.Replace(Htmlstring, @" <(.[^>]*)>", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @" <!--.*", "", RegexOptions.IgnoreCase);

        Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", " <", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", " ", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase);
        Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", "", RegexOptions.IgnoreCase);

        Htmlstring.Replace(" <", "");
        Htmlstring.Replace(">", "");
        Htmlstring.Replace("\r\n", "");
        Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim();

        return Htmlstring;
    }
  public string OutputBySize(string p_strContent)//分页函数
    {
        string m_strRet = "";
        int m_intPageSize = 2500;//文章每页大小
        int m_intCurrentPage = 1;//设置第一页为初始页
        int m_intTotalPage = 0;
        int m_intArticlelength = NoHTML(p_strContent).Length;//文章长度
        if (m_intPageSize < m_intArticlelength)
        {//如果每页大小大于文章长度时就不用分页了
            if (m_intArticlelength % m_intPageSize == 0)
            {//set total pages count
                m_intTotalPage = m_intArticlelength / m_intPageSize;
            }
            else
            {//if the totalsize
                m_intTotalPage = m_intArticlelength / m_intPageSize + 1;
            }
            if (Request.QueryString["pages"] != null)
            {//set Current page number
                try
                {//处理不正常的地址栏的值
                    m_intCurrentPage = Convert.ToInt32(Request.QueryString["pages"]);
                    if (m_intCurrentPage > m_intTotalPage)
                 
                        m_intCurrentPage = m_intTotalPage;
                 
                }

                catch
                {
                    m_intCurrentPage = m_intCurrentPage;
                }
            }
            //set the page content 设置获取当前页的大小
            if (m_intCurrentPage < m_intTotalPage)
            {
                m_intPageSize = m_intCurrentPage < m_intTotalPage ? m_intPageSize : (m_intArticlelength - m_intPageSize * (m_intCurrentPage - 1));
                m_strRet += p_strContent.Substring(m_intPageSize * (m_intCurrentPage - 1), m_intPageSize);
            }
            else if(m_intCurrentPage == m_intTotalPage )
            {
                int mm_intPageSize=m_intArticlelength - m_intPageSize * (m_intCurrentPage - 1);
                m_strRet += p_strContent.Substring(m_intArticlelength - mm_intPageSize);
            }
       
            string m_strPageInfo = " <p> </p>";
            for (int i = 1; i <= m_intTotalPage; i++)
            {
                if (i == m_intCurrentPage)
                    m_strPageInfo += "第" + i + "页 | ";
                else
                    m_strPageInfo += " <a href=news_id" + Request.QueryString["wzid"] + "_pages" + i + ".html>" + i + " </a>|";
            }
            //输出显示各个页码
            this.labPageNumber.Text = m_strPageInfo;

        }
        else
        {
            m_strRet += p_strContent;
        }
        return m_strRet;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
  SqlDataReader dr = shuju.duquzt(Int32.Parse(Request.QueryString["wzid"]));
        if (dr == null) return;
        if (dr.Read())
        {
            this.labContent.Text = OutputBySize(dr["wzcontent"].ToString());//调用该函数
...


前台页面分页处使用的控件: <asp:Label ID="labPageNumber"    Font-Size="14px" runat="server"> </asp:Label>
#12楼 得分:0回复于:2009-01-10 12:05:26
手动分页也会存在许多,用户都是笨,懒.
手动不是一个好方法!
我在CSDN下载找到了一个ASP的方法.但是没有ASP.NET的.
要翻译过来成APS.NET(C#)版本的也很难.大家来研究下啦.
显示结果页:
<!-- #include file="inc/conn.asp" -->
<!-- #include file="inc/Cls_doc.asp" -->
<%
Dim str

Dim sql,rs
sql = "select content from [test] where id=1"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.open sql,conn,1,1,1
If Not (rs.EOF Or rs.BOF) then
str = Replace(rs("content"),"&nbsp;"," ")
End If
rs.close
Set rs = Nothing
conn.close
Set conn = Nothing


Dim clsDoc,content,setpage
Set clsDoc = new splitDoc
clsDoc.sStr = str
clsDoc.pageSize = 2000
clsDoc.curPage = Request("docpage")
content = clsDoc.getStr()
setpage = clsDoc.showPage(para)
Set clsDoc = Nothing

%>

<body>
<div class="content"> <%=Replace(content," <br> <br>","",1,-1,1)%> </div>
<div class="setpage"> <%=setpage%> </div>
</body>

函数页:
<%
'Version 1.2
'Author Turnip
'QQ 63842303
'Update 2008-6-21 3:21:15

' 使用实例:
'
' Dim strCnt
' strCnt = " <P>0 <FONT face=Verdana>1 <BR>2 <BR>3 <BR>4 </FONT> <table> <tr> <td> </td> </tr> </table>5 </P>6"
'
' Dim clsDoc,content,setpage
'
' Set clsDoc = new splitDoc
' clsDoc.sStr = str(0) 字符串
' clsDoc.pageSize = 1 第页显示的字符数(可选,默认为1000个字符)
' clsDoc.curPage = Request("docpage") 要显示的页码
' content = clsDoc.getStr() 截取后的内容
' setpage = clsDoc.showPage(para) 翻页
' Set clsDoc = Nothing


Class splitDoc
    Private sRegExp        '正则对象
    Private arrLable        '存放标签的数组
    Private arrTotal        '存放数据和空标签的数组
    Private isInFst        '标签是否在字符串的开始
    Private isNeedSplit    '是否需要分隔
    Private isIncLabel      '字符串是否含有标签
    Private delimiter      '分隔符
    Public sStr            '字符串
    Public pageSize        '每页显示的字数---默认为1000字
    Public curPage          '现在要显示的页码---默认为第一页
    Private totalPage        '共有几页

    Public Function getStr()
        Call chkNeedR
        If isNeedSplit Then
            Dim iLable, iTotal, tmpNum, curNum, startNum, endNum, startPos, lenTmp, strTmp
Call chkCurPage()
            If Not isIncLabel Then '不含有标签,直接截取
                startPos = pageSize * (curPage - 1) + 1
                getStr = Mid(sStr, startPos, pageSize)
            Else
                curNum = 0
                startNum = pageSize * (curPage - 1) + 1
                endNum = pageSize * curPage
                iLable = 0
                Call getArrLable
                Call getArrTotal
                For iTotal = 0 To UBound(arrTotal)
                    lenTmp = Len(arrTotal(iTotal))
                    If lenTmp > 0 Then
                        If curNum < startNum Then
                            If curNum + lenTmp >= startNum Then
                                If curNum + lenTmp >= endNum Then
strTmp = strTmp & Mid(arrTotal(iTotal), startNum - curNum, endNum - startNum + 1)
                                    strTmp = strTmp & joinArrLable(iLable)
                                    Exit For
                                Else
                                    strTmp = strTmp & Mid(arrTotal(iTotal), startNum - curNum)
                                    curNum = curNum + lenTmp
                                End If
                            Else
                                curNum = curNum + lenTmp
                            End If
                        ElseIf curNum < endNum Then
                            If curNum + lenTmp <= endNum Then
                                strTmp = strTmp & arrTotal(iTotal)
                                curNum = curNum + lenTmp
                            Else
                                strTmp = strTmp & Mid(arrTotal(iTotal), 1, endNum - curNum)
                                strTmp = strTmp & joinArrLable(iLable)
                                Exit For
                            End If
                        Else
                            strTmp = strTmp & joinArrLable(iLable)
                            Exit For
                        End If
                        strTmp = strTmp & addALable(iLable)
                    Else
                        strTmp = strTmp & addALable(iLable)
                    End If
                Next
                getStr = TrimBlank(strTmp)
            End If
        Else
            getStr = sStr
        End If
    End Function

    Private Function joinArrLable(strtIndex)
        Dim i
        For i = strtIndex To UBound(arrLable)
            joinArrLable = joinArrLable & arrLable(i)
        Next
    End Function

Private Sub chkCurPage()
If Not IsNumeric(curPage) Then
curPage=1
ElseIf CDbl(curPage) <1 Then
curPage = 1
ElseIf CDbl(curPage)>totalPage Then
curPage=totalPage
End If
End Sub

    Private Function addALable(index)
        If index <= UBound(arrLable) Then
            addALable = arrLable(index)
            index = index + 1
        End If
    End Function

    Private Sub Class_Initialize()
        Set sRegExp = New RegExp
        sRegExp.Pattern = " <[^>]*>"
        sRegExp.IgnoreCase = True
        sRegExp.Global = True
        pageSize = 1000
        curPage = 1
        delimiter = "$split"
    End Sub
   
    Private Function TrimBlank(ByVal str)
Dim arrPattern(2),i
arrPattern(0) = " <tr[^>]*>( <td[^>]*>\s* <\/td>)* <\/tr>"
arrPattern(1) = " <table[^>]*> <\/table>"
arrPattern(2) = " <p[^>]*>( <\/?[^>]*>)* </p>"
For i=0 To UBound(arrPattern)
sRegExp.Pattern = arrPattern(i)
str = sRegExp.Replace(str, "")
Next
TrimBlank = str
    End Function
   
    Private Sub Class_Terminate()
        Set sRegExp = Nothing
    End Sub

    Private Sub getArrLable()
        Dim Match, Matches, RetStr, strTmp
        strTmp = sStr
        Set Matches = sRegExp.Execute(strTmp)
        For Each Match In Matches
            RetStr = RetStr & delimiter & Match.Value
        Next
        arrLable = Split(Mid(RetStr, Len(delimiter) + 1), delimiter)
    End Sub

    Private Sub getArrTotal()
        Dim strTmp
        strTmp = sStr
        arrTotal = Split(sRegExp.Replace(strTmp, delimiter), delimiter)
    End Sub

    Private Sub chkNeedR()
On Error Resume Next
        Dim strTmp, totalChr
        strTmp = sStr

        totalChr = Len(sRegExp.Replace(strTmp, ""))
        If Len(strTmp) <= pageSize Or totalChr <= pageSize Then
            totalPage = 1
            isNeedSplit = False
        Else
            totalPage = Fix(totalChr / pageSize)
            If (totalChr Mod pageSize) <> 0 Then totalPage = totalPage + 1
            isNeedSplit = True
        End If
        isIncLabel = sRegExp.test(strTmp)
    End Sub
   
    Public Function showPage(para)
        Dim arr,i,n
ReDim arr(totalPage)
        For i = 1 To totalPage
            If CStr(i) = CStr(curPage) Then
                arr(n) = " <span style=""color:red;"">[" & i & "] </span> "
            Else
                arr(n) = " <a href='?docpage=" & i & para & "'>[" & i & "] </a> "
            End If
            n = n + 1
        Next
        If totalPage > 1 Then showPage = " <div class=""docpage"" style=""text-align:center;"">" & Join(arr, "") & " </div>"
    End Function
End Class
%>

#13楼 得分:0回复于:2009-01-10 12:08:56
ASP ASPNET(C#)高手进!
请翻译下。
#14楼 得分:0回复于:2009-01-10 12:40:48
现在我觉得CSDN的所谓高手都是徒有虚名而已.
这个问题没有人能解决!
现在我觉得CSDN的所谓高手都是徒有虚名而已.
这个问题没有人能解决!
现在我觉得CSDN的所谓高手都是徒有虚名而已.
这个问题没有人能解决!
现在我觉得CSDN的所谓高手都是徒有虚名而已.
这个问题没有人能解决!
#15楼 得分:0回复于:2009-01-10 15:11:52
11楼的方法是可以解决你的需求的!!!!!!!!!
#16楼 得分:0回复于:2009-01-10 15:22:37
可以试试用段落的方式来分页呀。我看动易系统的东西,貌似就是用段落的方式来分页的
  • sxmonsy用户头像
  • sxmonsy
  • (吉尔赛那斯)
  • 等 级:
#17楼 得分:0回复于:2009-01-10 15:26:25
这楼好高呀.
  • xmq120用户头像
  • xmq120
  • (xmq120)
  • 等 级:
#18楼 得分:0回复于:2009-01-12 02:30:40
囧 真很难吗。。。。。。插入标识符号,输出的时候按照标识符进行分页即可 假如是生成静态页的话 就更加简单了啊
#19楼 得分:0回复于:2009-01-13 09:39:10
FCKeditor我前几天刚使用成功!我给大家一个把文章分割的存储在数组的好办法吧!
  public string[] filesplit(string content)
    {
        int fileindex = 0;
        //获取文章的长度
        int length = content.Length;
        //获取按照每页大小分成几页
        double i = (double)length / (double)(页面要显示的大小);
        //获取页码,向上取值
        int num = (int)Math.Ceiling(i);
        //获取数组大小
        string[] splitfile = new string[num];
        //循环存储文章内容
        while (content.Length > (页面要显示的大小)&& fileindex < num)
        {
            splitfile[fileindex] = content.Substring(0, (页面要显示的大小));
            content = content.Remove(0, splitfile[fileindex].Length);
            fileindex++;
        }
        splitfile[fileindex] = content;
        return splitfile;
    }
呵呵!这是我自己写的方法!如果有更好的希望不吝赐教!谢谢!我的qq757962437号!
我是一个初级程序员。愿结交天下程序爱好者!大家在交流中共同进步!
#20楼 得分:0回复于:2009-01-13 09:39:30
FCKeditor我前几天刚使用成功!我给大家一个把文章分割的存储在数组的好办法吧!
  public string[] filesplit(string content)
    {
        int fileindex = 0;
        //获取文章的长度
        int length = content.Length;
        //获取按照每页大小分成几页
        double i = (double)length / (double)(页面要显示的大小);
        //获取页码,向上取值
        int num = (int)Math.Ceiling(i);
        //获取数组大小
        string[] splitfile = new string[num];
        //循环存储文章内容
        while (content.Length > (页面要显示的大小)&& fileindex < num)
        {
            splitfile[fileindex] = content.Substring(0, (页面要显示的大小));
            content = content.Remove(0, splitfile[fileindex].Length);
            fileindex++;
        }
        splitfile[fileindex] = content;
        return splitfile;
    }
呵呵!这是我自己写的方法!如果有更好的希望不吝赐教!谢谢!我的qq757962437号!
我是一个初级程序员。愿结交天下程序爱好者!大家在交流中共同进步!
  • HDNGO用户头像
  • HDNGO
  • (礼拜一)
  • 等 级:
#21楼 得分:0回复于:2009-01-13 09:42:04
插入分页符吧。。简单方便~
#22楼 得分:0回复于:2009-01-13 09:42:23
呵呵!建议管理员,回复信息应该是按回复时间desc排列吧!我刚做完一个小论坛有感而发!
相关问题
老话题,新问题:新闻分页,将一篇过长的文章分页,生成静态页面Web ...
PHP生成HTML的内容分页问题请教!!在线等!! Web 开发/ PHP - CSDN ...
关于长文章自动分页的问题(在线等!) Web 开发/ ASP - CSDN社区 ...
请教文章过长分页的问题(100分请教,想知道的帮顶一下) .NET技术 ...
如何对文章内容进行分页
生成静态网页自动分页时,如何避免在截取的时候截断html语法?或可以在 ...