要处理的html内容如下:
var html = @"<a href=""javascript:alert('bug!');"" target=""_blank"" onclick=""hello()"" onmouseover=javascript:alert('bug')>这是个bug</a> <a href=javascript:alert('bug!'); target=""_blank"" onmouseover=""javascript:alert('bug')"">这是个bug</a> <>";
请问如何用正则表达式移除其中的"javascript:"部分?
正确移除后的内容如下:
@"<a target=""_blank"">这是个bug</a> <a target=""_blank"">这是个bug</a> <>"
html=Regex.Replace(html,@"(?<=<[a-z]+[^<]*)(\s*on[a-z]+(\s*=.*?)?)(?=\s+[^<]+/?>|/?>)","");
正则功力深厚!经测试,这个正则就可以将html标签中所有以on开头的属性移除。
加上移除 href="javascript:alert('bug!');" 的正则表达式,解决这个问题的正则表达试如下:
@"(?<=<[a-z]+[^<]*)(\s*on[a-z]+(\s*=.*?)?)(?=\s+[^<]+/?>|/?>)"
@"(<a[^>]*) href=['""]?javascript:.*?['""]?([ >])"
这个正则表达式在实际使用中遇到了问题,测试代码如下:
var html = @"<div class=""cnblogs_code""> <pre>#kpm-pack each='var projectFile in MANAGED_PROJECTS' configuration='${Configuration2}' kpmPackOutputDir='${BUILD_DIR}'</pre> </div>"; var processedHtml = HtmlUtility.RemoveAllScripts(html); Assert.Equal(html, processedHtml);
processedHtml却变成了:
<div class="cnblogs_code"> <pre>#kpm-pack each='var projectFile in MANAGED_PROJECTS' c> </div>
@dudu:
html=Regex.Replace(html,@"(?<=<[a-z]+[^<]*)(\s+on[a-z]+(\s*=.*?)?)(?=\s+[^<]+/?>|/?>)","");
@Yu: 测试通过!
string s = "<a href=\"javascript:alert('bug!');\" target=\"_blank\" onmouseover=\"javascript:alert('bug')\" >这是个bug</a>"; Regex r=new Regex(@"\s{1}\w+=""javascript:.+?"""); var re=r.Replace(s, ""); r =new Regex(@"\s{1}\w+=javascript:.+?\s{1}"); re = r.Replace(re, ""); r = new Regex(@"\s{1}\w+=javascript:.+?>"); re = r.Replace(re, ">"); Console.WriteLine(re);
考虑多种情况,那么多次匹配取值。。
有个说法是用正则来处理html是很低效的,相比不如当作xml文档使用xml库好。