注册 登录
编程论坛 ASP技术论坛

[经验]渚薰的ASP畅谈(五)定长截取文章内容☆☆☆☆

渚薰 发布于 2006-08-09 00:55, 3404 次点击

刚刚看到一帖讨论帖(原帖地址:[讨论]博克首页制作的问题)。关于定长截取文章内容(包含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编辑过]

10 回复
#2
因为帅烦2006-08-25 17:30
谢谢  不过如果能说下方法二的实现方法就好了
#3
乱弹琴2006-08-26 15:20

能不能把第一种再详细一下,我对javascript不熟悉啊

#4
渚薰2006-08-26 21:55
大致代码
&lt;script language="javascript"&gt;
    function Refresh()
    {
        var text=doucment.getElementById("html").innerText; //用innerText获得标签里的纯文本,已经去掉了html代码
        text=text.substring(0,40);   //截取定长内容;
        doucment.getElementById("Content").innerText=text;  //重新写入标签内
    }
&lt;/script&gt;


&lt;body onload="Refresh()"&gt;

&lt;div style="display:none" id="html"&gt;
    &lt;table&gt;
        &lt;tr&gt;
            &lt;td&gt;content&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/div&gt;  这是个隐藏层,用来存放从数据中读入content的内容

&lt;table&gt;
    &lt;tr&gt;
        &lt;td id="Content"&gt;&lt;/td&gt;           这里用来显示处理过后的文本
    &lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
#5
神州游侠2007-01-02 00:48
收集中。。。
精华文章怎么回的人这么少。。。???
#6
t567584082007-01-04 02:20
确实值得思考的问题 就是不太理解
#7
forever7592007-04-19 18:08
不错的方法!
#8
enjoy5352008-04-09 11:02
确实不错 ,收藏
#9
fuhuijun2008-04-09 11:52
收藏了研究一下
谢了
#10
dhdhzzw2008-04-09 12:30
好文章,
#11
cslldu2008-06-17 21:56
辛苦了
1