HTML条带功能

时间:2014-11-18 09:47:09

标签: c# html regex vb.net strip

有一个难以破解的坚果。

我有一个HTML,需要删除一些标签,属性和属性

基本上有三种不同的方法需要考虑:

  • 字符串操作:遍历HTML字符串并通过字符串操作将其删除'手动'
  • 正则表达式:Parsing HTML with RegEx is evil.正在剥离HTML邪恶吗?
  • 使用库剥离它(例如HTML Agility Pack)

我的愿望是我有以下列表:

  • acceptedTags(例如SPAN,DIV,OL,LI)
  • acceptedAttributes(例如STYLE,SRC)
  • acceptedProperties(例如TEXT-ALIGN,FONT-WEIGHT,COLOR,BACKGROUND-COLOR)

我可以传递给这个剥离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>
  1. 整个标记正文被剥离(不接受标记)
  2. 属性margin,font-family和font-size将从DIV-Tag
  3. 中删除
  4. 属性font-family和font-size将从SPAN-Tag中删除。
  5. 我尝试了什么?

    首映时,正则表达式似乎是最好的方法。但我无法让它正常工作。 关于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的答案很满意。

2 个答案:

答案 0 :(得分:2)

绝对使用图书馆! (见this

使用HTMLAgilityPack,您几乎可以完成所需的一切:

  1. 删除您不想要的标签:

    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);
        }
    }
    
  2. 删除您不想要的属性&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进行一些预处理验证并获得相同的格式等,以避免输出中断。

哦,并以块的形式复制,即只保留复制的索引,直到你到达复制结束,然后复制整个块,而不是单个字符!

希望这有助于作为一个起点。