[英]HTML Strip Function
有一个很难破解的坚果。
我有一个HTML,需要删除一些标签,属性和属性 。
基本上,要考虑三种不同的方法:
我希望我有以下清单:
我可以传递给剥离HTML的此函数。
输入示例:
<BODY STYLE="font-family:Tahoma;font-size:11;"> <DIV STYLE="margin:0 0 0 0;text-align:Left;font-family:Tahoma;font-size:16;"> <SPAN STYLE="font-weight:bold;color:#000000;background-color:#FF0000;font-family:tahoma;font-size:11;">Hello</SPAN></BODY>
示例输出(带有上面的参数列表):
<DIV STYLE="text-align:Left;"> <SPAN STYLE="font-weight:bold;color:#000000;background-color:#FF0000;">Hello</SPAN>
我尝试了什么?
乍看之下,正则表达式似乎是最好的方法。 但是我无法使其正常运行。 我看过关于Stackoverflow的文章:
...还有很多。
我尝试了以下正则表达式:
Dim AcceptableTags As String = "font|span|html|i|b|u|sup|sub|ol|ul|li|br|h2|h3|h4|h5|span|div|p|a|img|blockquote"
Dim WhiteListPattern As String = "</?(?(?=" & AcceptableTags & _
")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>"
Dim Html as String = Regex.Replace(b.HTML, WhiteListPattern, "", RegexOptions.Compiled)
但是,这仅删除标签,而没有属性或属性!
我绝对不是在寻找可以完成整个工作的人。 而是为某人指出了我正确的方向。
我对C#或VB.NET的回答感到满意。
绝对使用图书馆! (看这个 )
有了HTMLAgilityPack,您几乎可以做任何您想做的事情:
删除不需要的标签:
string[] allowedTags = {"SPAN", "DIV", "OL", "LI"}; foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//node()")) { if (!allowedTags.Contains(node.Name.ToUpper())) { HtmlNode parent = node.ParentNode; parent.RemoveChild(node,true); } }
删除不需要的属性并删除属性
string[] allowedAttributes = { "STYLE", "SRC" }; foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//node()")) { List<HtmlAttribute> attributesToRemove = new List<HtmlAttribute>(); foreach (HtmlAttribute att in node.Attributes) { if (!allowedAttributes.Contains(att.Name.ToUpper())) attributesToRemove.Add(att); else { string newAttrib = string.Empty; //do string manipulation based on your checking accepted properties //one way would be to split the attribute.Value by a semicolon and do a //String.Contains() on each one, not appending those that don't match. Maybe //use a StringBuilder instead too att.Value = newAttrib; } } foreach (HtmlAttribute attribute in attributesToRemove) { node.Attributes.Remove(attribute); } }
我实际上可能只是将自己写成一个多步骤过程:
1)排除所有从标记中删除要删除的标记的属性的规则(标记将不会在那里!)
2)遍历文档,获取文档的副本(不含排除的标记)(即,在您的示例中,将所有内容复制到“ <div”,然后等待直到看到“>”,然后再继续复制。如果我处于复制模式,并且看到“ ExcludedTag =“,然后停止复制,直到看到引号为止。
在运行此过程之前,您可能需要对html进行一些工作前验证,并设置相同的格式等,以避免输出损坏。
哦,分块复制,即只保留复制索引直到到达复制结束,然后复制整个块,而不是单个字符!
希望这可以作为起点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.