小小问题,大伤脑筋,解决立马给分

dhluo 2005-09-29 11:12:03
我们都知道,在客户端,无论是javascript还是vbscript,都能取用obj.innerText来获得这个obj内的“纯文本”。

现在的问题是:如何在服务器端(vbscript),实现同样的功能(有现成函数最好)?

举例:
我现在有这么个变量值:
str1="aaa<a href='#'>link text</a>bbb<a href='#'>link2 text2</a>ccc"
通过变换,我要得到的结果是str2="aaalink textbbblink2 text2ccc"
当然,这个str1是任意的html文件内容(类似动网论坛可以编辑发布的“富文本”)

我现在为止的成果:

Function vbInnerText(oldstr)
Dim regEx ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = "<.*?>" ' 设置模式。
do while (regEx.test(oldstr) )
oldstr = regEx.Replace(oldstr, "")
loop
vbInnerText=oldstr
End Function
str2=vbInnerText(str1)
问题的解决虽然笨了点,但至少开始我是觉得没问题的,试了一些都很好。但后来发现,我的一个str1(其实是数据库里content字段的值)里,含有类似这样的代码“<img src='...' onload="if(this.width>100){this.width=100}">”,因为这里有一个“>”号,我的函数立马失效了(匹配错误),得到的结果大相径庭。

基于类似情况的推广考虑(就是,在标准html的“<”和“>”之间,不能出现“<”和“>”,否则就出错,所以,现在为止我还没有更好的解决方法。

请高手或已有良好解决办法的朋友帮忙。
...全文
138 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tigerwen01 2005-09-29
  • 打赏
  • 举报
回复
给你个函数
function DelHtml(htmlCode)
dim iStart,iEnd
dim sTemp
sTemp=htmlCode
iStart=instr(sTemp,"<")
iEnd=instr(sTemp,">")
do while iStart>0 and iEnd>0 and iEnd-iStart>0
sTemp=replace(sTemp,mid(sTemp,iStart,iEnd-iStart+1),"")
iStart=instr(sTemp,"<")
iEnd=instr(sTemp,">")
loop
DelHtml=sTemp
end function
dhluo 2005-09-29
  • 打赏
  • 举报
回复
jzywh(江大鱼) :

你的解决方法很好!看来是正则表达式高手啊:)

其实刚才我看的另两个帖子:
“紧急求助,如何格式化一段HTML代码 ”
“ ASP 求一正则表达式 ”
都是我这个同样的问题。他们提出的解决方法,通常都是有效的,也类似我之前给的的解决方法。但碰到我说的问题的时候,就失效了。

jzywh(江大鱼) 的方法,基本可以,但要略改一下,模式表达式要改为:
regEx.Pattern = "</?\w+( \w+=[""'][^""]+?[""'])*>" '(多加了一个?号)

不加?号,模式会进行“最大化”匹配,在第一个引号后,一下子匹配到最后一个引号,就丢掉内容了。

但现在还有个问题是:现在的匹配,可以匹配这个:
<img src=""serter"" onload=""if(this.width>100){this.width=100;a='3'}"">
但不能匹配这个:
<img src=""serter"" onload='if(this.width>100){this.width=100;a=""3""}'>
问题就是单双引号嵌套的问题。

虽然理论上html和javascript之间代码的引号嵌套可以任意多层,但我们现在就暂时考虑嵌套一层的情况(否则好像正则表达式无能为力吧?)

我按你的思路写出一个表达式,但好像不行啊:
regEx.Pattern = "</?\w+( \w+=([""][^""]+?[""])|(['][^']+?[']))*>"

请继续帮我想想。
legend1970 2005-09-29
  • 打赏
  • 举报
回复
双引号的问题
javasam 2005-09-29
  • 打赏
  • 举报
回复
学习
jzywh 2005-09-29
  • 打赏
  • 举报
回复
用这个看看


<%
strObj="<font color=""#003399"">西餐厅</font><img src=""serter"" onload=""if(this.width>100){this.width=100}"">"
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = "</?\w+( \w+=[""'][^""]+[""'])*>" ' 设置模式。
regEx.IgnoreCase = True
regEx.Global = True
response.write regEx.replace(strObj,"")
%>
mymyal123 2005-09-29
  • 打赏
  • 举报
回复
说得这么复杂,看了半天,终于明白了你在说什么:

删除字符串中 < ... > 之间的内容就完了嘛,写得这么啰嗦.

HHH3000 2005-09-29
  • 打赏
  • 举报
回复
为什么不可以考虑使用2次以上的正则剔出呢?

比如第一次剔出"<<>>"这种情况,第二次剔出"<>",依次类推~
dhluo 2005-09-29
  • 打赏
  • 举报
回复
但是不知道还有没其他漏洞?
jzywh 2005-09-29
  • 打赏
  • 举报
回复
no thanks!
dhluo 2005-09-29
  • 打赏
  • 举报
回复
经过反复n次试验(可怜,我对正则表达式语法不熟悉,只能这样),最后确定可用的模式是:
regEx.Pattern = "</?\w+(( \w+=['][^']+?['])*|( \w+=[""][^""]+?[""])*|( \w+=[^""]+?)|( \w+=[^']+?))*>"

其实就是考虑到“< >”中有单双引号嵌套的问题,也考虑到属性值不加引号的情况。归纳起来,就是考虑到如下情况:
<img onload="if(this.width>100){this.width=100;a='3'}">
<img onload='if(this.width>100){this.width=100;a="3"}'>
<img border=0>
这样,就解决了我的问题。

谢谢各位,特别谢谢 jzywh(江大鱼)

ybfqlyq 2005-09-29
  • 打赏
  • 举报
回复
學習,,,幫你頂。。。
hudson 2005-09-29
  • 打赏
  • 举报
回复
把< 改成>(<的编码)把> 改成<(>的编码)
试试看
dhluo 2005-09-29
  • 打赏
  • 举报
回复
to: tigerwen01(小虎)(编程艺术化)

函数都不错。但这是基本的问题,大多数人都解决了的问题。而我碰到的问题是在此基础上的新情况。请仔细看我的帖子。
或者说,这个(类)函数,解决不了下面这个字符串:
strObj="<font color=""#003399"">西餐厅</font><img src=""serter"" onload=""if(this.width>100){this.width=100}"">"
因为这里出现了javascript里的“>”号。

也请看我上一个回复。

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧