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