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