`
shirlly
  • 浏览: 1623536 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

HTML文章中截取摘要的问题[转]

    博客分类:
  • .NET
阅读更多
博客系统通常的做法是,在博客的首页只显示文章的摘要,点击标题进入以后查看全文。显示哪一部分作为摘要是个比较特殊的问题,不同的系统都有自己不同的处理方式,有的是将摘要和扩展部分作为两个输入框,由用户自己决定哪些部分作为摘要,而且上下两部分都是完整的HTML,不存在截取的问题,就像本站使用的Serendipity系统。还有一种像WordPress,你可以自己在正文区中插入一个<!–More–>的标记,显示博客列表页的时候,会对文章以这个标记进行截取。不过我没有试过在一个Table的中间插入这个标记会怎么样,不过这种做法也是完全让用户自主决定如何截取文章,即使截错了,用户重新设置一下就OK了。

而我们公司的博客系统在设计之初,被很多人的意见所左右,(主要是许多没有真正写过博客的人的意见),意见是使用两个框的方式太麻烦,插入标记大部分恐怕也搞不懂,我们要给用户提供最简单的操作,用户只要写他的文章,如何截取交给系统就可以了。由此,让我陷入了一个疯狂改Bug的循环。

从整段的HTML中截取400个字作为摘要,如何处理?也许删除所有<>标签是最简单的办法,但是,博客的文字大家还是想要保留个性,而且有人想使用大字体,或者想对某篇文章使用大字体,以便更加显著,等等诸如此类的需求。总之,用户只想让自己的博客更漂亮,才不会管你怎么截取。

如果只是简单的按照400个字来截取,那么很可能会截到一个标签的中间,这半个标签可能就会导致后面的大段文本被作为标签内文字而不显示,直到遇到下一个结束符为止。于是首先要根据<>标记符,确保要截取的位置不在这两个标记中间。具体的做法是,找到一个<符号,看看里面的标记,去找它所对应的末尾标记,比如找到<p,就去找</p>,找到<div,就去找</div>。随后又发现,如果截取了半个Table,整个页面的布局就会错位,博客的侧边栏都跑到正文的下面去了,因为被作为Table里面的单元格来处理了。想来想去,决定如果出现Table的话,就在Table之前截断,结果导致许多文章的摘要里一个字都没有。然后又发现,不止Table会破坏布局,如果div的前后不对应,布局也会错位,因为我们的博客模板使用的是Div布局。用前面的截取方法存在一个问题,因为Div是可以嵌套的,连续的两个<div><div>标记,就会出现遇到第一个div标记的时候,直接跳到了第一个结尾的</div>标记上去,结果第二个<div>就没有结束符了。除此之外,font, span等等都是可以嵌套的。

后来又想了个办法,干脆把所有的div, font, span全部过滤掉,所<p></p>全部换成br,终于,基本上不会出现截错的问题了,但是,许多文章的分段和缩进是在div里面使用style来定义的(不知道这些用户的文章是从哪里拷过来的),结果许多人的博客首页文字都变成了一样的12px文字,而且密密麻麻挤在一起,极其不美观。再后来,还是有个用户报怨自己博客页面出错,无法打开。进去一看,他的博客文章里居然有N多<!–[IF[之类的标记,出现这种符号以后,用来截取的正则表达式就会报错。于是又在截取之前将注释类符号全部删掉。过了两天,他又报错,原来文章里还有<![IF这样的标签。God,你从哪里复制来的文章啊?

没办法了,即要保留格式,又要兼容各种不可预期的标签结构,这个问题一定要解决。

思路:想在不破坏格式的情况下截取文字,最保险的方法是,保留所有的格式。于是想到一个办法,只对文本内容使用字数限制,而留下所有的HTML标记。比如要取400个字,那么,从正文的第一个字符开始算,如果是普通的文本,放入结果变量,并将记数器加1。如果记数器已经到了400,就忽略这个字。如果字符是<,那么将其后所有的文本放入结果变量,直到>为止。这样,最后截取出来的摘要包括了400个文字,和一堆格式完整的HTML标签。(前提是他贴进来的时候HTML本来就是完整的)。

但是,如果在达到400字以后后面还有一些br, p, li的话,摘要后面就会出现很大的一段空白,那当然是不行的。因此还要把这些东西处理掉,数p的个数太麻烦,把p变成br,如果记数器已经到了400,忽略掉所有的br标签。对li也是,但是处理要特殊一点,因为不能在两个li中间截断。同理,可以对<tr><td>做同样的处理,这样就不会出现半个空白的表格了。

总体使用下来,这个效果还是可以接受的。虽然源代码里多了很多无用的代码(特别是那些从Word里面粘贴文章过来的人),但是从表面上看,截取是比较完美的。

转自:http://www.unfish.net/archives/128-20070629.html
分享到:
评论

相关推荐

    支持中文、保留格式的文章摘要插件 for Wordpress.zip

    如果你不喜欢 Wordpress 博客的首页每篇文章都显示全文,拖得太长,嫌它速度既慢又影响美观,那么你需要一个摘要插件。 据我所知,现在的摘要插件要么对中文支持得不好,容易出现乱码;要么把原文所有的格式都去掉...

    asp.net(文章截取前几行作为列表摘要)无损返回HTML代码

    代码如下: /* 时间很久远了,有码友...&lt;/STRONG&gt; * 函数: * 说明:无损返回HTML代码 * * 作者:卡斯Kas(QQ:10590916) * 修改:2010-12-13、 */ public static string LeftH(string str, int l) { //为了防止错误

    C#获取HTML文本的第一张图片与截取内容摘要示例代码

    在日常web开发的时候,经常会遇到需要获取保存的HTML文本中的第一张图片,并且截取内容摘要的效果,例如织梦的后台添加完详细内容后就是自动读取内容摘要,并保存第一张图片为缩略图,那么这篇文章跟大家分享下利用...

    文章管理系统

    修复11.1补丁造成的文章内容摘要过滤HTML失效而可能影响到前台排版问题【重要】 2011年11月1日 BUG修复+细节完善 ★更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去;进入后台皮肤管理...

    PHP实现补齐关闭的HTML标签

    很多时候,在我们做文章截取摘要的时候,如果出现HTML的内容,会出现截取的文章没有结束的HTML标签。这样的情况下就会出现页面样式错乱的问题。这 个时候我们需要的就是把缺少的结束标签加批量加上。在www.php.net...

    wordpress首页文章限制显示字数的方法

    –more–&gt;标签,这样,你可以自由的控制在列表页文章要显示的是哪一部分内容,这样也可以起到控制摘要字数的作用。 方法二:使用excerpt_length钩子 这个方法通过一个钩子来确定the_excerpt()函数的显示字数,在模板...

    WP主题:HotNewspro 2.4

    7.新版增加对WP摘要的支持,貌似很多童鞋对首页截断后的文章无排版格式的很不满意,所以这次增加手动添加摘要功能,方法是在文章编辑页面,摘要中输入首页要显示的内容,支持段落及段首空格,可以看我的最新文章...

    月儿猫猫ASP生成HTML全站静态客户体验专业版.rar

    1.文章,图片,音乐功能:发表自动HTML生成,分类内容列表批量静态生成可自动更新,批量更新模板,摘要,评论,清晰易用多功能UBB工具栏,可设置置顶,批量删除评论 2.友情链接--HTML生成,前台客户端自动更新,可...

    机智内容管理系统2.0

    参数: "intro_sub"=&gt;"200" 说明: 文章摘要默认截取数,也可以指定数 参数: "ordersort"=&gt;"desc" 说明: 默认按优先级倒序(数字大靠前),可以修改为asc正序 (优先级最高) 参数: "orderdate"=&gt;"desc" 说明: 默认按优先级...

    exBlog v1.3.0 Beta 2

     [增加] 控制每页显示文章篇数,自动摘要截取字数等设置  [增加] 强化后台文章编辑列表多条件自定义查询  [增加] 批量移动文章及其评论  [增加] 更多后台设置  [增加] 文件上传管理  [增加] 上传文件简单...

    正式版的VeryCMS管理系统程序 v3.0gbk,utf8,big5

    可自定义上传图片附件是否自动生成缩略图,并可自定义缩略图格式,保持原图比例,自动从原图按照缩略图的高宽比例进行截取;应用Ajax技术进行附件的管理,方便快捷,让您的网站附件内容管理更加井井有条! 10,...

Global site tag (gtag.js) - Google Analytics