从字符串

时间:2016-09-26 10:54:46

标签: c# html string

我使用 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;
    }

1 个答案:

答案 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>&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>