[英]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.