繁体   English   中英

从字符串中删除多余的html标签

[英]Remove redundant html tags from string

我用html格式的文本编写了各种字符串对象。 其中一些字符串在结尾处包含一些我想以编程方式删除的标记,例如结尾处的这些换行符段落标记:

<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;
    }

如果需要操纵HTML,则可以使用HtmlAgilityPack类的HTML解析器, 而不是 字符串方法或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>&nbsp;";

并且您想删除所有<p><br>标记以及&nbsp; 从最后评论。 您可以使用以下方法,该方法使用词典,其中键是标记名,值是该标记内部文本的字符串,因此是子选择器。 如果该值为空序列,则无论标签的内部文本如何,都应将其删除。 这是您需要的字典:

var tagsToRemove = new Dictionary<string, IEnumerable<string>>
{
    { "br", Enumerable.Empty<string>() }, { "p", Enumerable.Empty<string>() }, { "#text", new[] { "&nbsp;" } }
};

现在,查找所有要删除的标签的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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM