如果全盘删除里面的HTML标签,可能会造成阅读上的困难(比如a,img这些标签),最好是删除一部分,保留一部分.
正则表达式里,判断包含某些字符串是非常容易理解的,但是如何判断不包含某些字符串(是字符串,不是字符,是某些,不是某个)确实是个费解的事.
代码如下:
<(?!((/?\s?li)|(/?\s?ul)|(/?\s?a)|(/?\s?img)|(/?\s?br)|(/?\s?span)|(/?\s?b)))[^>]+>
这个正则是判断HTML标签不包含li/ul/a/img/br/span/b的,就上面的要求来说,是要删除除这里列出的HTML标签,这也是我摸索了很长时间才搞出来的.
(?!exp)匹配后面跟的不是exp的位置
/?\s?我一开始试着把它写到最前面的<后面,但是测试失败了.
下面是一个简单的函数,把要保留的TAG串起来,生成一个正则表达式,然后把不需要的TAG删除...
代码如下:
privatestaticstringRemoveSpecifyHtml(stringctx){
string[]holdTags={"a","img","br","strong","b","span"};//要保留的tag
//<(?!((/?\s?li)|(/?\s?ul)|(/?\s?a)|(/?\s?img)|(/?\s?br)|(/?\s?span)|(/?\s?b)))[^>]+>
stringregStr=string.Format(@"<(?!((/?\s?{0})))[^>]+>",string.Join(@")|(/?\s?",holdTags));
Regexreg=newRegex(regStr,RegexOptions.Compiled|RegexOptions.Multiline|RegexOptions.IgnoreCase);
returnreg.Replace(ctx,"");
}
修正:
上面的正则,如果保留了li,实际运行会发现link也给保留下来了,保留a会把addr也给保留下来,解决办法就是加\b断言.
代码如下:
<(?!((/?\s?li\b)|(/?\s?ul)|(/?\s?a\b)|(/?\s?img\b)|(/?\s?br\b)|(/?\s?span\b)|(/?\s?b\b)))[^>]+>
privatestaticstringRemoveSpecifyHtml(stringctx){
string[]holdTags={"a","img","br","strong","b","span","li"};//保留的tag
//<(?!((/?\s?li\b)|(/?\s?ul\b)|(/?\s?a\b)|(/?\s?img\b)|(/?\s?br\b)|(/?\s?span\b)|(/?\s?b\b)))[^>]+>
stringregStr=string.Format(@"<(?!((/?\s?{0})))[^>]+>",string.Join(@"\b)|(/?\s?",holdTags));
Regexreg=newRegex(regStr,RegexOptions.Compiled|RegexOptions.Multiline|RegexOptions.IgnoreCase);
returnreg.Replace(ctx,"");
}
|