从字符串中删除格式错误的HTML

时间:2013-11-26 15:35:56

标签: c# html

有时来自第三方API,我会收到格式错误的HTML元素:

olor:red">Text</span>

当我期待:

<span style="color:red">Text</span>

对于我的上下文,HTML的文本内容更重要,因此如果我丢失了周围的标签/格式,则无关紧要。

删除格式错误的代码的最佳方法是什么,以便第一个示例读取

Text

第二个不会改变?

3 个答案:

答案 0 :(得分:1)

我建议你看看HtmlAgilityPack,这是一个非常方便的HTML清理工具。

以下是使用上述库的方法示例:

static void Main()
{
    var inputs = new[] { 
    @"olor:red"">Text</span>",
    @"<span style=""color:red"">Text</span>",
    @"Text</span>",
    @"<span style=""color:red"">Text",
    @"<span style=""color:red"">Text"
    };
    var doc = new HtmlDocument();
    inputs.ToList().ForEach(i => {
        if (!i.StartsWith("<"))
        {
            if (i.IndexOf(">") != i.Length-1)
                i = "<" + i;
            else
                i = i.Substring(0, i.IndexOf("<"));
            doc.LoadHtml(i);
            Console.WriteLine(doc.DocumentNode.InnerText);
        }
        else
        {
            doc.LoadHtml(i);
            Console.WriteLine(doc.DocumentNode.OuterHtml);
        }
    });
}

输出:

Text
<span style="color:red">Text</span>
Text
<span style="color:red">Text</span>
<span style="color:red">Text</span>

答案 1 :(得分:0)

非常粗略地说,您可以通过在>之前删除所有内容并将所有内容保留在<之前删除所有“标记”。

我假设您还需要考虑收到的文字没有标签的情况:例如: Text

在伪代码中:

returnText = ""

loop:
    gtI = text.IndexOf(">")
    ltI = text.IndexOf("<")
    if -1==gtI and -1==ltI:
        returnText += text
        we're done
    if gtI==-1:
        returnText += text up to position ltI
        return returnText
    if ltI==-1:
        returnText += text after gtI
        return returnText
    if ltI < gtI:
        returnText += textBefore ltI
        text = text after ltI
        loop
    // gtI < ltI:
    text = text after gtI
    loop

使用自定义编码解析器可以做得更好(也更快),但基本上逻辑是相同的。

你真的应该问为什么API只返回你需要的部分内容:我不明白为什么它应该返回ext</span>,这真的让你感到困惑。

答案 2 :(得分:0)

如果您只需要标签的内容,并且没有标签类型的信息等,您可以使用正则表达式:

var r = new Regex(">([^>]+)<");
var text = "olor:red\">Text</span>";

var m = r.Match(text);

这将找到每个标签的每个内部文本。