标题:[经验]渚薰的ASP畅谈(五)定长截取文章内容☆☆☆☆
只看楼主
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
 问题点数:0 回复次数:10 
[经验]渚薰的ASP畅谈(五)定长截取文章内容☆☆☆☆

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

搜索更多相关主题的帖子: ASP 经验 畅谈 
2006-08-09 00:55
因为帅烦
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-5-1
得分:0 
谢谢  不过如果能说下方法二的实现方法就好了
2006-08-25 17:30
乱弹琴
Rank: 1
等 级:新手上路
威 望:1
帖 子:1665
专家分:0
注 册:2006-3-7
得分:0 

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


男人的謊言可以騙女人的壹夜! 女人的謊言可以騙男人的壹生!
2006-08-26 15:20
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
得分:0 
大致代码
&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;

个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2006-08-26 21:55
神州游侠
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2006-5-20
得分:0 
收集中。。。
精华文章怎么回的人这么少。。。???

2007-01-02 00:48
t56758408
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2007-1-4
得分:0 
确实值得思考的问题 就是不太理解
2007-01-04 02:20
forever759
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2006-11-29
得分:0 
不错的方法!
2007-04-19 18:08
enjoy535
Rank: 1
等 级:新手上路
帖 子:114
专家分:3
注 册:2007-1-16
得分:0 
确实不错 ,收藏

2008-04-09 11:02
fuhuijun
Rank: 1
等 级:新手上路
帖 子:407
专家分:0
注 册:2007-10-30
得分:0 
收藏了研究一下
谢了
2008-04-09 11:52
dhdhzzw
Rank: 1
等 级:新手上路
帖 子:949
专家分:0
注 册:2007-8-13
得分:0 
好文章,
2008-04-09 12:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-82904-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.132140 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved