yet

Dream Will Come True

 

怎样去获取文章简介

     相信大家在做博客,文章管理系统之类的时候经常会遇到这样的问题:
 
   把一些文章抽出来放在首页,当然这些文章要显示内容简介。但是问题来了,这些内容简介有时候有HTML,有时候没有,如果单纯的去截断字符似乎有点笨拙,特别是在DIV页面上,很容易就截断了HTML,导致页面变形了。
    解决办法有很多,有些人是用div的样式去隐藏来解决,但是还是不完整,导致页面变形,或者直接显示出整篇文章来。

下面的代码就可以解决这个问题,(:) 代码很简单,只是介乎你有没有认真去想而已了,在这里就不对代码做相信说明了。)
使用方法:直接调用 StripLongContent("你的内容",你要显示在页面上的长度);

static Regex Content_regex = new Regex("<[^<>]+>?", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
        
public static string StripLongContent(string content, int length)
        
{
            
//去掉JS
            
//content = StripScriptTags(content);
            string input = "";
            
//如果总长度都不够指定的长度,直接返回
            if (content.Length <= length)
                
return content;
            
//匹配出<>中的标签 
            Match mx = Content_regex.Match(content, 0, content.Length);
            Stack tagStack 
= new Stack();
            
int startIndex = 0;
            
string temp = "";
            
int maxlength = 0;
            
//其实很简单,保证截取出来的段落有结束的html标签就可以了,但是也不能出现类似
            
//<tr><td></tr>
            
//的HTML问题
            while (mx.Value != string.Empty)
            
{
                temp 
= content.Substring(startIndex, mx.Index);
                
//当然也要保证非显示字符数不要包括到要显示的字符数中。否则会严重影响简介的质量
                
//或者你要这里确定一个br算多少个字符都可以
                if (maxlength + temp.Length >= length)
                
{
                    temp 
= temp.Substring(0, length - maxlength);
                    input 
= input + temp + ""
                    maxlength 
= length;
                    
break;
                }

                maxlength 
+= temp.Length;
                input 
= input + temp + mx.Value;

                
//分别对HTML标签进行压栈出栈操作
                if (mx.Value.EndsWith("/>"))
                
{
                }

                
else if (mx.Value.StartsWith("</"))
                    tagStack.Pop();
                
else
                    tagStack.Push(mx.Value);



                
int index = content.IndexOf(mx.Value);
                content 
= content.Remove(0, index);
                content 
= content.Remove(0, mx.Length);

                mx 
= Content_regex.Match(content, 0, content.Length);
            }

            
//如果整篇文章没有HTML标签,直接切就可以了
            if (maxlength == 0)
            
{
                
if (content.Length < length)
                    content 
= input + content;
                
else
                    content 
= input + content.Substring(0, length) + "";
                
return content;
            }

            
//按顺序补全未结束的HTML标签
            while (tagStack.Count > 0)
            
{
                
string tag = tagStack.Pop().ToString();
                
if (tag.IndexOf(' '> 0)
                    tag 
= tag.Substring(0, tag.IndexOf(' ')).Replace("<""");
                
else
                    tag 
= tag.Replace("<""").Replace(">""");
                input 
= input + "</" + tag + ">";
            }

            
return input;
        }

                           2007-10-25 最后更新

posted on 2007-10-24 13:40 yet 阅读(1763) 评论(24)  编辑 收藏 网摘

评论

#1楼 2007-10-24 13:42 亚历山大同志      

又没注释又没说明,对如此代码只能惊为天人......GOD,我的眼睛   回复  引用  查看    

#2楼 2007-10-24 13:46 亚历山大同志      

大概看了2分钟,你的做法就是把所有的html的tag去掉后然后再截取,对不?   回复  引用  查看    

#3楼 2007-10-24 13:54 雨恨云愁      

不好意思.
扫了一眼就知道意思了
这个 <[^<>]+>? 正则
是有问题的
  回复  引用  查看    

#4楼[楼主] 2007-10-24 14:00 yet      

其实。。。。。可能我的表达方式有问题。。。
或者说你们没有遇到过这种问题。
亚历山大同志,如果单纯的去掉html的tag显示的话就像现在博客园的首页这样,显示出来的文章简介没有格式,很奇怪。。。。。

雨恨云愁

。。。。。。。

晕,看来我错了。
  回复  引用  查看    

#5楼 2007-10-24 14:04 Clark Zheng      

不错,下载下来试试   回复  引用  查看    

#6楼 2007-10-24 14:14 duxer      

然这要显示内容简介。但是问题来了,这些内容简介有时候有HTML,有时候没有,如果单纯的去截断字符似乎有点笨拙,<table><tr><td>特别是在DIV页面上,很容易就截断了HTML,导致页面变形了。<br />asdfasfsdf<img src="aDasd" /></td></tr></table><,,,,>


如果取上面的内容,长度为100,那么结果为

然这要显示内容简介。但是问题来了,这些内容简介有时候有HTML,有时候没有,如果单纯的去截断字符似乎有点笨拙,<table><tr><td>特别是在DIV页面上,很容易就截断了HTML,导致页面变形了。<br />asdfasfsdf<img src="aDasd" /></td></tr></table><,,,,></,,,,>
  回复  引用  查看    

#7楼[楼主] 2007-10-24 14:18 yet      

@duxer
这应该算是不正确的HTML或者xml标签吧?而且也不影响页面
@JerryChou
呵呵,其实163的博客也就是大概这样。。。。
  回复  引用  查看    

#8楼 2007-10-24 14:20 Clark Zheng      

试完了,还不错   回复  引用  查看    

#9楼[楼主] 2007-10-24 14:20 yet      

不过没考虑&nbsp;的情况。。。这就大家自己去发挥了。。哈
  回复  引用  查看    

#10楼 2007-10-24 14:22 flower.b      

呵呵,不错。

我觉得还需要把内容中包含的样式表去掉。不然有些文章颜色、字号不整齐,显示在首页上不是很好看。
  回复  引用  查看    

#11楼 2007-10-24 14:24 Felix      

我认为这个问题有待继续研究,不知道楼主的代码是否可以完美解决,但我想应该不是很简单的,毕竟截取出来的html片段情况太多变,比如td标签就不光是要保证末尾有td标签,还需要有tr和table标签,以及更外层的包围,这样才是完美的解决方案,可以试试用SgmlReader这个组建来生成截断后的HTML   回复  引用  查看    

#12楼[楼主] 2007-10-24 14:34 yet      

@Felix
“比如td标签就不光是要保证末尾有td标签,还需要有tr和table标签”
这个问题在上文中是已经解决了的。。。



@flower.b

至于这些问题的话,各人有各人的需要吧。。呵呵,但是要去掉其实也不是难事。。。
  回复  引用  查看    

#13楼 2007-10-24 14:43 Felix      

不错不错,收藏了慢慢研究,正需要。。   回复  引用  查看    

#14楼 2007-10-24 14:48 老刀把子      

我觉得获得文章简介是需要人工的干预的,
毕竟有个阅读,然后抽象归纳的过程。

如果是单纯抽取html 中的文本,那就条条路通罗马了。


  回复  引用  查看    

#15楼[楼主] 2007-10-24 15:02 yet      

@老刀把子
博客之类的东西,最不可能人工去干预。。。很多时候没必要吹毛求疵,真的要实现那种只能的去抽取文章简介那是比较困难的。

嗯嗯,确实是条条道路通罗马,如果单纯抽取html中的文本的话,博客园 的首页就是一种,163博客也是一种,只是看乎你选择那个是自己需要的问题。。。。
  回复  引用  查看    

#16楼 2007-10-24 15:38 wingoo      

今天恰巧也有类似需求,,不过只是去除html,js等,怕太麻烦了影响效率-__-
StripScriptTags是cs里的吧,今天也copy了这个函数^_^
  回复  引用  查看    

#17楼 2007-10-24 15:39 Mic[未注册用户]

真笨!
1、先截取所需长度
2、找到第一个</标记然后递归处理就成,原理就是确保HTML标记的完整性嘛。无非就是要对<td></tr>做些特殊处理嘛,准确的说有它两出现而没</table>时可以考虑重新截取或是填充完整。
  回复  引用    

#18楼[楼主] 2007-10-24 15:45 yet      

@wingoo
呵呵,在.NET里这些字符串的操作效率其实我觉得可以忽略不记啦。
@Mic
- - ~~!!确实,原理很简单。只是在于想到和去用而已。呵呵
  回复  引用  查看    

#19楼 2007-10-24 15:57 李华顺      

我的做法是先用正则去掉<.+?>的东西
再截取字符串
  回复  引用  查看    

#20楼 2007-10-24 15:59 李华顺      

@Mic
你这样的做法,文本长度会有差距的,先截取字符串会把HTML标签也算进去
还有</ 也是不准确的!
如:有这样的东西<br /><img />
  回复  引用  查看    

#21楼[楼主] 2007-10-24 16:04 yet      

@李华顺
然后你这样截取出来的简介就跟原文的格式不同了。。。。很多博客文章都是比较有“性格”的
  回复  引用  查看    

#22楼 2007-10-24 16:39       

我还以为分析文章内容,提炼出简介。。。看错了。   回复  引用  查看    

#23楼 2007-10-25 09:09 亚历山大同志      

仔细想了一下,这个方式有问题,如果是如博客园这样子提取出来在首页上显示无数人个人的内容,那么很简单的一大串<br>就可以把首页破坏了,会增加不少额外的成本。
所以还要在进一步的话应该只判断出段落把所有的<BR>都省略掉,然后空格也要参加计数
  回复  引用  查看    

#24楼 2007-10-25 13:21 半山旅客

试试还行。。   回复  引用    

#25楼 2007-10-25 17:14 8976342123[未注册用户]

效率也太差了吧?   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 936043




相关文章:

相关链接:

导航

统计

公告

yet

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔档案

test

最新评论

阅读排行榜

评论排行榜