刚刚看到一帖讨论帖(原帖地址:[讨论]博克首页制作的问题)。关于定长截取文章内容(包含HTML代码的)的问题。
此类问题,遇到的困惑就是无法简单的用Left来判断到底应该截取多少字符,比如这么一段文章内容
<table><tr><td>你好你好</td></table>
如果想要截取2个字符,那么Left(str,2)肯定是错的,因为这样只截取到"<t"
那如何来解决这个问题呢?我分两种应用情况来说明
1、截取后的内容只用保留纯文字,可以舍弃html标记
这个情况下,操作算比较简单的。首先,网页中定义个隐藏div标签或span标签,把文章内容(以下用content表示)写入进去。部分代码如下:
<div style="display:none" id="content"><%=content%></div>
然后,当网页onload后,用javascript来读取div中的内容,部分代码如下:
text=document.getElementById("content").innerText
注意,在这里用的是innerText,它和innerHTML的区别就在于,innerHTML读取的是div标签中的HTML代码,而innerText只读取div标签中的纯文本,这样就轻松的把文本部分可提取出来了。另补充,如果要提起纯文本,也可以把content中的所有html标签用正则表达式都替换掉。两者都是可行的。之后只要针对text进行定长截取就可以了。
2、截取后,也必须保留html格式
这个情况下,显得相对复杂。光是用截取技术是不可行,必须掌握一定的编译原理以及数据结构。大致原理如下,针对html标记,分为两类:单标记,即没有闭标记的html标记,如"<br>";另外就是双标记,就是有闭标记的html标记,如<a></a>。所要做的就是对content的内容字符串进行遍历,执行如下算法。
(1)遇到一个单标记(可以用instr找一个个字符检查,也可以用正则表达式来定位),不去管它。
(2)遇到一个双标记的开标记,该开标记进栈
(3)遇到纯文本,文本数累计器自加1
(4)遇到一个双标记的闭标记,栈顶元素出栈
(5)如果文本数累计器=所要截取的文本长度,那么执行(6),否则返回执行(1)
(6)截取字符串到遍历的当前位置,赋值给strHTML
(7)栈顶元素出帐,把该出栈元素(即开标记)所对应的闭标记添加到strHTML末尾,直到栈为空。
(8)操作结束
这个算法主要运用到了html的双标记特性,配合栈先进后出原则的使用(如果有学过数据结构的,可以明白算术表达式的计算就是这样来匹配括号的)。我粗略的写了一下,容错性还不强,比如遇到某些既可有闭标记又可没有的(如<li>),又比如xhtml的标准是所有单标记和没有内容的双标记都采用<..../>的方式结束等等。我不久会给出尽量完善代码,希望大家一起讨论。
[此贴子已经被作者于2006-8-26 21:48:53编辑过]