`
shirlly
  • 浏览: 1647673 次
  • 性别: 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
分享到:
评论

相关推荐

    用htmlparser截取html摘要实现源码

    要使用HTMLParser截取摘要,我们首先需要导入相关的库。HTMLParser库提供了DOM(文档对象模型)和SAX(简单API for XML)两种解析模式,这里我们将主要介绍基于DOM的解析方法,因为它更容易理解和操作。 1. **安装...

    javascript 文章截取部分无损html显示实现代码

    JavaScript中的HTML内容截取是一个常见的需求,特别是在网页搜索或摘要展示时。为了在不破坏HTML结构的情况下截取文章的一部分,我们需要编写智能的代码来处理HTML字符串。以下是对给定的JavaScript代码的详细解释:...

    HTML仿CSDN摘要源码

    此外,还可以用JavaScript动态生成摘要,根据文章长度截取前几句话或者指定字符数。 3. 源码 源码是编程或开发过程中编写的人类可读的代码,它是程序的原始形式。HTML源码是指编写好的HTML文件,包含了所有定义...

    wordpress截取首页摘要内容的方法

    在WordPress中,有时候我们需要在首页显示文章的摘要而不是完整的正文,以提高页面的加载速度和用户体验。本篇文章将详细介绍如何利用WordPress的自定义函数`add_filter`来实现这一功能。 首先,我们需要理解`add_...

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

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

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

    ### *** 文章截取前几行作为列表摘要无损返回HTML代码知识点总结 #### 1. HTML代码的无损截取需求背景 在网页内容展示或者内容摘要生成过程中,经常需要从HTML格式的文章中提取部分内容作为列表的摘要。对于HTML...

    wordpress摘要插件wp-utf8-excerpt

    3. **自动摘要**:如果用户不希望手动编写摘要,插件还提供了自动截取文章前部分内容作为摘要的功能,可自定义截取的字符数。 4. **SEO 优化**:良好的摘要能够提升搜索引擎的抓取效率,从而提高文章在搜索结果中的...

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

    例如,当你需要在列表页显示文章预览时,可以先调用`GetFirstImageUrl`获取缩略图,再调用`GetContentSummary`截取摘要,从而展示文章的关键信息。 总结,通过C#提供的字符串处理和正则表达式功能,我们可以轻松地...

    php对包含html标签的字符串进行截取的函数分享

    这个函数在处理网页内容、文章摘要或者限制显示长度等场景中非常有用。需要注意的是,由于HTML解析的复杂性,这个函数可能无法处理所有复杂的情况,但对于大多数常规HTML结构的字符串,它能提供有效的帮助,避免了因...

    PHP版自动生成文章摘要

    标题中的“PHP版自动生成文章摘要”指的是使用PHP编程语言实现的一种功能,它能够自动从文章内容中提取出摘要,特别是在处理包含HTML代码的文章时,能够确保摘要的生成不会导致HTML标签的不完整或破坏文档结构。...

    WordPress 文章摘要功能实现代码

    echomb_strimwidth()函数负责根据指定的字符数限制截取文本,而strip_tags()函数则确保输出的摘要中不包含任何HTML标签。apply_filters()函数则是WordPress内置的一个钩子(hook),可以对文章内容进行过滤处理。 ...

    smarty中先strip_tags过滤html标签后truncate截取文章运用

    接下来,对文章的内容使用`truncate`函数进行截取,这里假设文章内容存储在`$article.content`变量中,截取长度设置为35个字符,并在截取的末尾添加省略号表示还有更多内容。 具体来看代码实现: ```php $smarty=...

    JavaScript 版本自动生成文章摘要

    JavaScript自动生成文章摘要功能主要是为了帮助用户从长篇幅的文本中提取关键信息,以便用户可以迅速掌握文章的主旨。这种方法特别有用,因为它可以避免手动进行文本编辑时可能出现的繁琐工作,比如决定在哪里截断...

    Python实现提取文章摘要的方法

    当遇到HTML数据时,`handle_data`方法会被调用,将文本内容添加到摘要中,同时确保不超出设定的字符数。`get_summary`方法则用于封装摘要,可选地添加指定的前缀和后缀,并包裹在指定的HTML标签内。 在实际应用中,...

    自动生成文章摘要的代码[PHP 版本]

    这篇文章主要介绍了一个使用PHP编写的自动生成文章摘要的代码,其目标是截取包含HTML代码的文本,并确保在截断过程中不会导致HTML标签未闭合,从而破坏文档结构。这个功能在博客或新闻网站等场景中非常实用,因为它...

    使用php实现截取指定长度

    特别是在处理文本信息,比如文章摘要、用户输入等情况下,我们需要按照一定的长度要求来截取字符串。PHP本身提供了多种函数来实现字符串的截取,其中最常用的函数是substr。但是,在截取含有中文字符的字符串时,...

    自动生成文章摘要的代码[JavaScript 版本]

    本文将详细介绍如何使用JavaScript编写一个自动摘要生成器,该摘要生成器能够处理包含HTML标签的文本,并确保生成的摘要不会出现未闭合的HTML标签问题。这对于网站内容预览、新闻摘要等应用场景非常有用。 #### ...

Global site tag (gtag.js) - Google Analytics