日期:2014-05-18  浏览次数:20824 次

滤掉 html标记_正则表达式问题
大家好!   我遇到了一个正则表达式问题    
Regex   rx   =   new   Regex(@ "( <\/?(?!td|tr|u|table|img|div|span|br|object|select|/select|OPTION|/OPTION|param|&nbsp|sup|/sup|sub|/sub|p|/p)[^> \/]*)\/?> | <![^> ]+> ",   RegexOptions.IgnoreCase);
string   result   =   rx.Replace(str,   " ");
我的目的是   滤掉   html标记(除tr|u|table|img|div|span.....特殊标记)

遇到问题是

str= " <font> 111 <IMG   ondblclick=Modify(this);   title=\ "wertewt <   <   <   123.GIF\ "> </font> ";  

应得到结果:

111 <IMG   ondblclick=Modify(this);   title= "wertewt <   <   <   123.GIF "   >


但实际   我得到的是   111 <IMG   ondblclick=Modify(this);   title= "wertewt


------解决方案--------------------
你想滤掉 html 标记,建议你不要用一个模式处理所有标记,可以写一组模式,每个模式滤掉一个标记,用循环来处理。这样做有两个好处,首先,每个标记的模式都很简单,日后很好理解,其次,你可以在外部文件中记录这组模式,当你想增加两个标记时不需要重新编译。

比如去掉 font,用这个模式把原来的串换成 $1,(?is: <font> (.*?) </font> )
------解决方案--------------------
LS是否考虑过下面这个问题
<IMG ondblclick=Modify(this); title=\ "wertewt < < < 123.GIF\ ">
如果考虑并解决了,那么一个正则就全部解决了,根本用不着多个正则,如果上面这个问题没有解决,那么再多的正则也没用

另外就是正则效率本来就低,如果再写多个正则,每个正则去循环替换一次,那效率就不用想了。。。

因为可能在 " "或 ' '内锯含“ <”和“> ”这两个字符,所以无法使用平衡组来做,只能用多重匹配,但写了一个,在测试工具里通过,程序里会导致程序崩溃,正则解决这类问题还是比较吃力的

在另一个帖子里我用有限状态机实现了,可以做下参考
http://community.csdn.net/Expert/topic/5744/5744945.xml?temp=.806698


------解决方案--------------------
html的规则其实很复杂的。 <(\w+)> [^ <]+ <\1> 这样的,或者没有后面部分的。或者嵌套的。规则复杂的还是交给.net作好了。你html放到webbrower里头,然后用outterText获取文本。