长文章分页一点思路 - 后台数据库编程 - 经典论坛

来源:百度文库 编辑:神马文学网 时间:2024/04/29 06:16:45
如何将长长的一篇文章分成几页显示?最简单也最完美的办法是人为的告诉程序哪边要分页,并做上相应的分页标识,但是这样无疑加大了录入员的工作量;另一种办法是程序自动进行分页,比如按字数每页显示多少个字,但这边要注意的问题是不能截断HTML、UBB等代码,大家可根据需要选择一种方式。还有一点要说明的是读取方式,很多人都是显示新一页时从数据库重新读取内容,而我的思路是一次读取将不同页内容保存于一个数组中再利用脚本动态更新,有人又要说了,这样不便于搜索引擎收录,大家还是根据需要选择,呵呵。
一、人为做分页标识
为了方便使用,我写成了一个函数mySplit,使用时拷贝一下调用就可以了
1.多次读取
[Copy to clipboard]
CODE:
‘函数名称:mySplit
‘编写:Dnawo(http://www.mzwu.com/)
‘功能说明:按分页标识mark分几页显示内容content,有分页列表
‘参数说明:
‘content:内容
‘mark:分页标识
‘page:当前页数
‘调用格式:Call mySplit("aaa{!page}bbb{!page}ccc","{!page}",request("page"))
Sub mySplit(content,mark,page)
If Instr(content,mark)=0 then
Response.write content
Exit Sub
End if
Dim strContent,i
If isempty(page)="" then page=0
page = Cint(page)
strContent = Split(content,mark)
Response.write strContent(page) & vbcrlf
Response.write "
"
If page>0 then Response.write " "
For i=0 to Ubound(strContent)
Response.write "" & i+1 & " "
Next
If page"
Response.write "
"
End Sub
2.一次读取
[Copy to clipboard]
CODE:
‘函数名称:mySplit
‘编写:Dnawo(http://www.mzwu.com/)
‘功能说明:按分页标识mark分几页显示内容content,有分页列表
‘参数说明:
‘content:内容
‘mark:分页标识
‘调用格式:Response.write mySplit("aaa{!page}bbb{!page}ccc","{!page}")
Function mySplit(content,mark)
mySplit = mySplit + "
" & vbcrlf
mySplit = mySplit + "
" & vbcrlf
mySplit = mySplit + "" & vbcrlf
End Function
二、程序自动分页
程序自动进行分页,网上查了相关资料,用得最多的方法不外乎三种:第一种按每页显示多少字进行分页,不考虑是否会截断HTML、UBB标记,这种方法最不可取;第二种方法按每页显示多少行进行分页,但实际上我们并不会给每行都加上
,所以这种方法也不可取;第三种方法先设 pagesize 为基本页长,先找到这个基本页长,从这里出发,再去找 “

” 或 “
” 这样的分段符号,找到后,记下它的位置和从起始位置到它有多少个字符,下一页,从这个分段符出发,再找基本页,再寻分段符,记录位置和长度。。就这样循环,到文章结束,此法最为可取,下边函数基本参数了此法,但做了一些改进,是从基本页长位置向前向后找

,采取就近原则,用最近的位置做为分页点,函数代码如下:
[Copy to clipboard]
CODE:
‘函数名称:MarkContent
‘编写:Dnawo(http://www.mzwu.com/)
‘功能说明:按每页显示iCount字进行分页,在分页处插入分页标识符,再配合mySplit函数进行分页。实际每页字数约等于iCount
‘参数说明:
‘strContent:要进行分页的内容
‘iStart:开始位置
‘iCount:每页总字符数
Function MarkContent(strContent,iStart,iCount)
MarkContent = strContent
If Len(Right(MarkContent,Len(MarkContent)-iStart+1))<=iCount then
Exit Function
Else
‘声明一些常量变量
Const strMark = "{!page}"
Dim strTemp,arr(4),iLen,iStartb,strLeft,strRight,i
iLen = Len(strMark)
‘将原字符串拆分
strTemp = Left(MarkContent,iStart-1)
MarkContent = Right(MarkContent,Len(MarkContent)-iStart+1)
‘判断iCount位置是不是处于


上并进行相应处理
If mid(MarkContent,iCount,1)=">" then iCount = iCount + 1
If mid(MarkContent,iCount,2)="p>" then iCount = iCount + 2
If mid(MarkContent,iCount,2)="r>" then iCount = iCount + 2
If mid(MarkContent,iCount,3)="br>" then iCount = iCount + 3
If mid(MarkContent,iCount,3)="

" then iCount = iCount + 3
If mid(MarkContent,iCount,4)="
" then iCount = iCount + 4
‘从iCount位置往前往后找


,采取就近原则,在离iCount最近的位置进行分页
arr(0) = InstrRev(MarkContent,"
",iCount,1)
arr(1) = InstrRev(MarkContent,"

",iCount,1)
arr(2) = Instr(iCount,MarkContent,"
",1)
arr(3) = Instr(iCount,MarkContent,"

",1)
arr(4) = 0
If arr(0)<>0 and arr(4)=0 then
arr(4) = abs(arr(0)-iStart)
iStartb = arr(0) + 4
Elseif arr(0)<>0 and abs(arr(0)-iStart) < arr(4) then
arr(4) = abs(arr(0)-iStart)
iStartb = arr(0) + 4
End if
If arr(1)<>0 and arr(4)=0 then
arr(4) = abs(arr(1)-iStart)
iStartb = arr(1) + 3
Elseif arr(1)<>0 and abs(arr(1)-iStart) < arr(4) then
arr(4) = abs(arr(1)-iStart)
iStartb = arr(1) + 3
End if
If arr(2)<>0 and arr(4)=0 then
arr(4) = abs(arr(2)-iStart)
iStartb = arr(2) + 4
Elseif arr(2)<>0 and abs(arr(2)-iStart) < arr(4) then
arr(4) = abs(arr(2)-iStart)
iStartb = arr(2) + 4
End if
If arr(3)<>0 and arr(4)=0 then
arr(4) = abs(arr(3)-iStart)
iStartb = arr(3) + 3
Elseif arr(3)<>0 and abs(arr(3)-iStart) < arr(4) then
arr(4) = abs(arr(3)-iStart)
iStartb = arr(3) + 3
End if
If arr(4)=0 then
MarkContent = strTemp & MarkContent
Else
strLeft = Left(MarkContent,iStartb-1)
strRight = Right(MarkContent,Len(MarkContent)-iStartb+1)
MarkContent = strTemp & strLeft & strMark & strRight
iStartb = iStartb + iLen + iStart - 1
‘递归
MarkContent = MarkContent(MarkContent,iStartb,iCount)
End if
End if
End Function