有一个难以破解的坚果。
我有一个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)
但是,仅删除标记 strong>且没有属性或属性!
我绝对不会找一个做整个工作的人。相反,有人指出了我正确的方向。
我对C#或VB.NET的答案很满意。
答案 0 :(得分:2)
绝对使用图书馆! (见this)
使用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);
}
}
删除您不想要的属性&amp;删除属性
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 :(得分:1)
我可能实际上只是把它写成一个多步骤的过程:
1)排除从列表中删除属性的所有规则,这些标记列为要删除的标记(无论如何标记都不存在!)
2)走完文档,拿一份没有排除标签的文件副本(例如,在你的例子中,将所有内容复制到“&lt; div”,然后等到我看到“&gt;”再继续复制。如果我' m在复印模式下,我看到“ExcludedTag =”然后停止复制,直到我看到引号。
您可能希望在运行此过程之前对html进行一些预处理验证并获得相同的格式等,以避免输出中断。
哦,并以块的形式复制,即只保留复制的索引,直到你到达复制结束,然后复制整个块,而不是单个字符!
希望这有助于作为一个起点。