-5

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

"
<html>

<body>

</body>

</html>
"

谢谢

4

4 回答 4

5

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

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

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

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

对于一些简单的 HTML 标记场景或格式如此糟糕的标记,解析器会立即停止处理,然后是的,您可以恢复破解输入字符串……使用字符串替换等……这一切都取决于您的需要您采取哪种方法。

以下是一些可以帮助您的工具:

HTML 整洁

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

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

HtmlAgilityPack

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

于 2012-08-24T10:55:58.320 回答
3
myString = myString.Replace(System.Environment.NewLine, "");
于 2012-08-24T10:52:12.800 回答
0

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

s = RegEx.Replace(s, @"\s+", String.Empty);
于 2012-08-24T10:48:16.927 回答
-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);
}
于 2021-01-14T15:33:43.680 回答