教你怎么在输出文本时替换掉所有HTML标记

发表于:2007-06-30来源:作者:点击数: 标签:
只写给新手的,各前辈就别来看我搬门弄斧了。hehe 经常看见有新手来问类似这样的话题,其实关于正则表达式我也不太懂。 昨天下午看了一下微软的正则表达式,少许理解。 今天也写个函数,只当实践,有误人之处请指点。 下面是一个实例: 原文是这样的:"a href

只写给新手的,各前辈就别来看我搬门弄斧了。hehe
经常看见有新手来问类似这样的话题,其实关于正则表达式我也不太懂。
昨天下午看了一下微软的正则表达式,少许理解。
今天也写个函数,只当实践,有误人之处请指点。
下面是一个实例:
原文是这样的:"<a href=""blueidea.com""><strong>test1</strong></a> <b>test2</b> <font color=red>test3</font> test4"

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

关键就在于<[^{><}]*>这个正则表达式,虽然很简单,但我还是我凭我浅浅理解,给大家说一下。
HTML标记是以小于号“<”开始,以大于号“>”,结束的。
所以这个正则表达式中的所有大于小于号都代表HTML标记,不是特殊字符。
“[”“]”方括号表达式中所包含的字符只匹配该括号表达式在正则表达式中
所处位置的一个单字符,我简单的理解为,它是匹配某位置的单个字符。
“^”标记是特殊符号,在方括号里面,后面跟的是列表字符,所以它的意思是
所有不在列表或范围中的字符。按我的理解他就相当于我们程序中的“NOT”
所以方括号中的^{><}的意思就是,这个单字符非大于或非小于号。
里面的大括号去掉其实也一样。大括号也是特殊字符
“*”也是特殊符号 匹配前面的子表达式零次或多次,
总的理解起来就是,在一个以小于号“”开始,并以大于号“”结束的标记,并且里面可以有多个的非大于或非小于号字符。这样也就匹配了HTML标记了。
呵呵,废话一堆

<%
Function RegExpTest(patrn,strng,rewho)
Dim re,Match,Matches
RetStr=strng
Set re = New RegExp //建立正则表达式
re.Pattern = patrn //建立正则表达式模式
re.IgnoreCase = True //是否不区分大小写,你可以关闭,因为HTML标记是不区分大小写的。
re.Global = True //是否全局可用
Set Matches = re.Execute(strng) //执行搜索
For Each Match in Matches //遍历匹配集合
    RetStr=replace(RetStr,match.value,rewho) //找到区配字符,并开始替换
Next
RegExpTest = RetStr
End Function
content="<a href= test.asp >test1</a>test2 <strong>test3</strong> test4" //这是原文
pattern="<[^{><}]*>" //正则表达式模式,这里也可以理解成将要被替换掉的字符
Restr="" //将要替换成什么字符
response.write RegExpTest(pattern,content,restr)
%>

现在就还有一个问题。"<[^><]*>" 既然只匹配在一个以小于号“”开始,
并以大于号“”结束的标记,并且里面可以有多个的非大于或非小于号字符。
那么这样的<a href=<b>>就只被匹配一次了,因为<a ***>里还有HTML标记<b>所
以,不能匹配<a ***>,只能匹配<b>,那这样剩下的就是<a href=>
等于说并不会把所有的HTML都匹配掉。。。
我这里也有一个傻瓜的办法。就是执行RegExpTest函数两次


<%
Function RegExpTest(patrn,strng,rewho)
Dim re,Match,Matches
RetStr=strng
Set re = New RegExp //建立正则表达式
re.Pattern = patrn //建立正则表达式模式
re.IgnoreCase = True //是否不区分大小写可以关闭,因为HTML标记不区分大小写
re.Global = True //是否全局可用
Set Matches = re.Execute(strng) //执行搜索
For Each Match in Matches //遍历匹配集合
    RetStr=replace(RetStr,match.value,rewho) //找到区配字符,并开始替换
Next
RegExpTest = RetStr
End Function
content="<a href=<b>>test<>" //这是原文
pattern="<[^{><}]*>" //正则表达式模式,这里也可以理解成将要被替换掉的字符
Restr="" //将要替换成什么字符
Stest=RegExpTest(pattern,content,restr)
response.write RegExpTest(pattern,STest,restr)
%>


这样是可以,可是要是原文大一点的话一定会影响速度的,高手们是否有更好的办法呀。

另外这个函数还有另外一个用处。相信大家都知道GOOGLE搜索出来的关键字都是加了
红色的了,同样,用这个函数也可以做到的。
比如说我想把"<a href=""blueidea.com""><strong>test1</strong></a> <b>test2</b> <font color=red>test3</font> test4中的es都变成红色,
那这个函数就这样调用。RegExpTest("es",原文,"<font color=red>es</font

>"
下面测试一下吧。

你现在应该懂得怎么做了吧。呵呵
具体请参见微软正则表达试

原文转自:http://www.ltesting.net