簡體   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