有时来自第三方API,我会收到格式错误的HTML元素:
olor:red">Text</span>
当我期待:
<span style="color:red">Text</span>
对于我的上下文,HTML的文本内容更重要,因此如果我丢失了周围的标签/格式,则无关紧要。
删除格式错误的代码的最佳方法是什么,以便第一个示例读取
Text
第二个不会改变?
答案 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);
这将找到每个标签的每个内部文本。