是否可以在 C# 中删除以下 HTML 字符串中的所有空格:
"
<html>
<body>
</body>
</html>
"
谢谢
在处理 HTML 或任何标记时,通常最好通过真正理解该标记规则的解析器来运行它。
第一个好处是它可以告诉您您的初始输入数据是否是垃圾。
如果解析器足够聪明,它甚至可以自动纠正格式错误的标记,或者以宽松的规则接受它。
然后,您可以修改解析的内容....并让解析器写出更改...这样您可以确保遵循标记规则并且您有正确的输出。
对于一些简单的 HTML 标记场景或格式如此糟糕的标记,解析器会立即停止处理,然后是的,您可以恢复破解输入字符串……使用字符串替换等……这一切都取决于您的需要您采取哪种方法。
以下是一些可以帮助您的工具:
您可以使用 HTML Tidy 并指定一些关于如何整理 HTML 的选项/规则(例如删除多余的空格)。
它是一个 WIN32 DLL……但有 C# Wrappers。
如果您需要更好地理解结构并可能自己进行整理/重组,您可以使用 HtmlAgilityPack 来解析 HTML。
myString = myString.Replace(System.Environment.NewLine, "");
您可以使用正则表达式来匹配替换的空格字符:
s = RegEx.Replace(s, @"\s+", String.Empty);
我使用了这个解决方案(我认为它运作良好。另见测试代码):
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);
}