日期:2014-05-17  浏览次数:20906 次

如何提取文章内容的前几百个字符的问题?
做了个新闻系统,显示最新的新闻在主页。要求显示前200个字。也就是说在新闻内容里提取前200个字符显示在主页上。
后台发表新闻的内容用的是FCKEDITOR(当然其他的编辑器可能也是一样的)。

比如下面的一段内容显示没问题了:
"aa   bb   cc........ "

可是如加入了可视编辑器的自动标签后,问题就出现了,如:
" <font   color=red> aa   bbb...hhhh..lll. </font> "
如这一整段内容在200个字符内,就显示正常,如这段内容超过了200个字符,就只剩下没完成的HTML了,比如可能截取后为:
" <font   color=red> aa   bbb...hhhh "
这样就造成下面的字体出现颜色错误了。
同样的情况发生在前200个字有表格、图片……几乎一切的HTML标签。

目前我的方法是REPLACE掉标签。可是这样又有其他问题了,一是看起来不美观了。二是HTML标签太多了,REPLACE太多,造成显示速度下降。

------解决方案--------------------
<%
'去除HTML标记
Function delHTML(s_string)
Dim re
Set re = New RegExp
re.Pattern = " <[^ <> ]*> "
re.Global = true
delHTML = re.Replace(s_string, " ")
End Function
%>
------解决方案--------------------
Function RemoveHTML( strText )
Dim TAGLIST
TAGLIST = ";!--;!DOCTYPE;A;ACRONYM;ADDRESS;APPLET;AREA;B;BASE;BASEFONT; " &_
"BGSOUND;BIG;BLOCKQUOTE;BODY;BUTTON;CAPTION;CENTER;CITE;CODE; " &_
"COL;COLGROUP;COMMENT;DD;DEL;DFN;DIR;DIV;DL;DT;EM;EMBED;FIELDSET; " &_
"FONT;FORM;FRAME;FRAMESET;HEAD;H1;H2;H3;H4;H5;H6;HR;HTML;I;IFRAME; " &_
"INPUT;INS;ISINDEX;KBD;LABEL;LAYER;LAGEND;LI;LINK;LISTING;MAP;MARQUEE; " &_
"MENU;META;NOBR;NOFRAMES;NOSCRIPT;OBJECT;OL;OPTION;PARAM;PLAINTEXT; " &_
"PRE;Q;S;SAMP;SCRIPT;SELECT;SMALL;SPAN;STRIKE;STRONG;STYLE;SUB;SUP; " &_
"TBODY;TEXTAREA;TFOOT;TH;THEAD;TITLE;TT;U;UL;VAR;WBR;XMP; "

Const BLOCKTAGLIST = ";APPLET;EMBED;FRAMESET;HEAD;NOFRAMES;NOSCRIPT;OBJECT;SCRIPT;STYLE; "

Dim nPos1
Dim nPos2
Dim nPos3
Dim strResult
Dim strTagName
Dim bRemove
Dim bSearchForBlock

nPos1 = InStr(strText, " < ")
Do While nPos1 > 0
nPos2 = InStr(nPos1 + 1, strText, "> ")
If nPos2 > 0 Then
strTagName = Mid(strText, nPos1 + 1, nPos2 - nPos1 - 1)
strTagName = Replace(Replace(strTagName, vbCr, " "), vbLf, " ")

nPos3 = InStr(strTagName, " ")
If nPos3 > 0 Then
strTagName = Left(strTagName, nPos3 - 1)
End If

If Left(strTagName, 1) = "/ " Then
strTagName = Mid(strTagName, 2)
bSearchForBlock = False
Else
bSearchForBlock = True
End If

If InStr(1, TAGLIST, "; " & strTagName & "; ", vbTextCompare) > 0 Then
bRemove = True
If bSearchForBlock Then
If InStr(1, BLOCKTAGLIST, "; " & strTagName & "; ", vbTextCompare) > 0 Then
nPos2 = Len(strText)
nPos3 = InStr(nPos1 + 1, strText, " </ " & strTagName, vbTextCompare)
If nPos3 > 0 Then
nPos3 = InStr(nPos3 + 1, strText, "> ")
End If

If nPos3 > 0 Then
nPos2 = nPos3