我使用 html 格式化文本的各种字符串对象。其中一些字符串包含我想要以编程方式删除的某些标记,例如最后的 linebreak 和段标记:
<li><ol> **Text/List** </li></ol><p><br></p><br><br>
我需要从其端点检查字符串,但我无法弄清楚在哪里切断结束,或者在哪里寻找切割点。我只需要摆脱这些冗余标签。
我尝试构建一个检查字符串的函数,我知道它不能正常工作,但这是我的基础:
public static String RemoveRedundantTags(this String baseString, String html)
{
if (html.Contains("<"))
{
for (Int32 i = html.Length - 1; i >= 1; i--)
{
if (html[i] == '<' && html[i - 1] != '>' && html[i + 1] != '/')
{
redundantTags = html.Substring(html[i], html.Length - i);
html = html.Replace(redundantTags, String.Empty);
return html;
}
}
}
return html;
}
答案 0 :(得分:2)
如果我需要操作HTML,我会使用像HtmlAgilityPack
这样的HTML解析器,不是 string methods or regex。以下是从末尾删除所有br
的示例:
string html = "<li><ol> **Text/List** </li></ol><p><br></p><br><br>";
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var brToRemove = doc.DocumentNode.Descendants().Reverse().TakeWhile(n => n.Name == "br");
foreach (HtmlNode node in brToRemove)
node.Remove();
using (StringWriter writer = new StringWriter())
{
doc.Save(writer);
string result = writer.ToString();
}
结果是:
<li><ol> **Text/List** </ol></li><p>
正如您在默认情况下所看到的,它本身修复了解析错误。有一个:
未找到开始标记
<ol>
如果html是
html = "<ol><li>TEXT</li></ol><p><br></p><p><br></p> ";
您想要删除所有<p>
和<br>
代码,还要删除结尾处的
作为评论。您可以使用以下方法,该方法使用字典,其中键是标记名称,值是此标记的内部文本的字符串,因此是子选择器。如果值是空序列,则无论内容是什么,都应删除标记。这是一本符合您要求的字典:
var tagsToRemove = new Dictionary<string, IEnumerable<string>>
{
{ "br", Enumerable.Empty<string>() }, { "p", Enumerable.Empty<string>() }, { "#text", new[] { " " } }
};
现在查找要删除的所有标签的LINQ查询是:
var brToRemove = doc.DocumentNode.Descendants()
.Reverse()
.TakeWhile(n => tagsToRemove.ContainsKey(n.Name)
&& tagsToRemove[n.Name].DefaultIfEmpty(n.InnerText).Contains(n.InnerText));
(期望)结果是:
<ol><li>TEXT</li></ol>