C#删除HTML字符串中的空格

时间:2012-08-24 10:45:30

标签: c# string

是否可以在C#中删除以下HTML字符串中的所有空格:

"
<html>

<body>

</body>

</html>
"

由于

4 个答案:

答案 0 :(得分:5)

在处理HTML或任何标记时,通常最好通过真正理解该标记规则的解析器来运行它。

第一个好处是,它可以告诉您初始输入数据是否为垃圾开头。

如果解析器足够智能,它甚至可以自动纠正格式错误的标记,或者用宽松的规则接受它。

然后,您可以修改已解析的内容....并让解析器写出更改...这样您就可以确保遵循标记规则并且输出正确。

对于一些简单的HTML标记场景或者标记形成得非常糟糕,解析器只是立即在它上面进行打击,然后是的,你可以恢复黑客输入字符串......用字符串替换等等....所有取决于您对采取哪种方法的需求。

以下是一些可以帮助您解决问题的工具:

HTML Tidy

您可以使用HTML Tidy,只需指定一些关于如何整理HTML的选项/规则(例如删除多余的空格)。

这是一个WIN32 DLL ...但它有C#Wrappers。

HtmlAgilityPack

如果你需要更好地理解结构并且可能自己整理/重组,你可以使用HtmlAgilityPack来解析HTML。

答案 1 :(得分:3)

myString = myString.Replace(System.Environment.NewLine, "");

答案 2 :(得分:1)

您可以使用正则表达式匹配替换的空白字符:

s = RegEx.Replace(s, @"\s+", String.Empty);

答案 3 :(得分:-1)

我使用了这个解决方案(在我看来它运行良好。另见测试代码):

  1. 添加一个扩展方法来修剪 HTML 字符串:
public static string RemoveSuperfluousWhitespaces(this string input)
{
    if (input.Length < 3) return input;
    var resultString = new StringBuilder(); // Using StringBuilder is much faster than using regular expressions here!
    var inputChars = input.ToCharArray();
    var index1 = 0;
    var index2 = 1;
    var index3 = 2;
    // Remove superfluous white spaces from the html stream by the following replacements:
    //  '<no whitespace>' '>' '<whitespace>' ==> '<no whitespace>' '>'
    //  '<whitespace>' '<' '<no whitespace>' ==> '<' '<no whitespace>'
    while (index3 < inputChars.Length)
    {
        var char1 = inputChars[index1];
        var char2 = inputChars[index2];
        var char3 = inputChars[index3];
        if (!Char.IsWhiteSpace(char1) && char2 == '>' && Char.IsWhiteSpace(char3))
        {
            // drop whitespace character in char3
            index3++;
        }
        else if (Char.IsWhiteSpace(char1) && char2 == '<' && !Char.IsWhiteSpace(char3))
        {
            // drop whitespace character in char1
            index1 = index2;
            index2 = index3;
            index3++;
        }
        else
        {
            resultString.Append(char1);
            index1 = index2;
            index2 = index3;
            index3++;
        }
    }

    // (index3 >= inputChars.Length)
    resultString.Append(inputChars[index1]);
    resultString.Append(inputChars[index2]);
    var str = resultString.ToString();
    return str;
}

// 2) add test code:

[Test]
public void TestRemoveSuperfluousWhitespaces()
{
    var html1 = "<td class=\"keycolumn\"><p class=\"mandatory\">Some recipe parameter name</p></td>";
    var html2 = $"<td class=\"keycolumn\">{Environment.NewLine}<p class=\"mandatory\">Some recipe parameter name</p>{Environment.NewLine}</td>";
    var html3 = $"<td class=\"keycolumn\">{Environment.NewLine} <p class=\"mandatory\">Some recipe parameter name</p> {Environment.NewLine}</td>";
    var html4 = " <td class=\"keycolumn\"><p class=\"mandatory\">Some recipe parameter name</p></td>";
    var html5 = "<td class=\"keycolumn\"><p class=\"mandatory\">Some recipe parameter name</p></td> ";
    var compactedHtml1 = html1.RemoveSuperfluousWhitespaces();
    compactedHtml1.Should().BeEquivalentTo(html1);
    var compactedHtml2 = html2.RemoveSuperfluousWhitespaces();
    compactedHtml2.Should().BeEquivalentTo(html1);
    var compactedHtml3 = html3.RemoveSuperfluousWhitespaces();
    compactedHtml3.Should().BeEquivalentTo(html1);
    var compactedHtml4 = html4.RemoveSuperfluousWhitespaces();
    compactedHtml4.Should().BeEquivalentTo(html1);
    var compactedHtml5 = html5.RemoveSuperfluousWhitespaces();
    compactedHtml5.Should().BeEquivalentTo(html1);
}