繁体   English   中英

从字符串中剥离格式错误的HTML

[英]Stripping out malformed HTML from string

有时从第三方API中,我会返回格式错误的HTML元素:

olor:red">Text</span>

当我期望:

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

就我的上下文而言,HTML的文本内容更为重要,因此如果丢失周围的标签/格式也没关系。

去除格式错误的标签的最佳方法是什么,以便第一个示例可以读取

Text

第二个不会改变吗?

我建议您看一下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>

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

我假设您还需要考虑收到的文本没有标签的情况:例如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> ,这确实使您感到困惑。

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

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

var m = r.Match(text);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM