【问题标题】:Remove redundant html tags from string从字符串中删除多余的 html 标签
【发布时间】:2017-02-03 16:28:44
【问题描述】:

我有各种 string 对象,带有 html 格式的文本。其中一些字符串的末尾包含某些我想以编程方式删除的标签,例如末尾的这些 linebreakparagraph 标签:

<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 标记,只保留文本。
  • 冗余是什么意思?是什么让它们变得多余?到目前为止,您尝试过什么?
  • 我从 TFS 获取它们,当创建整个事物的人做了几个换行符并且没有删除它们时,它们被留下了标签。他们在我的输出中创建了空白空间。我需要其他 html 标签,因为整个东西都插入到 Word 中。
  • htmlstring.Replace("&lt;br&gt;","").Replace("&lt;p&gt;","").Replace("&lt;/p&gt;",""); 或类似的东西怎么样?
  • 这将删除整个字符串中的每个段落和每个换行符,这些类型的标签通常不是多余的,只是末尾没有实际内容的标签。

标签: c# html string


【解决方案1】:

如果我需要处理 HTML,我会使用 HTML 解析器,例如 HtmlAgilityPacknot 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>

正如您所看到的,默认情况下它会自行修复解析错误。有一个:

找不到开始标签&lt;ol&gt;


如果 html 是

html = "<ol><li>TEXT</li></ol><p><br></p><p><br></p>&nbsp;";

并且您想要删除所有 &lt;p&gt;&lt;br&gt; 标记,以及注释中的末尾的 &amp;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>

【讨论】:

  • 适用于这个特定的字符串,谢谢,它比我现在拥有的要多得多,但它不起作用的地方是这个字符串:
  • TEXT



     
  • @tweedledum11:期望的结果是什么?
  • 期望的结果是有文本和使用的 html 标签(如本例中的 li 和 ol),而没有这些位于实际内容末尾的换行和段落标签。它们是我不希望在结果输出中出现的剩余部分。
  • @tweedledum11: 但这不是有效的 html,liol 标签没有开始标签。如果您想删除&amp;nbsp;&lt;br&gt; + &lt;p&gt; 标签,那么剩下的唯一有效html 是"TEXT"。您要保留该无效的 html 还是要删除它?
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多