我目前正在开发一个程序,允许我将HTML源代码输入到RichTextBox控件中,并从标记之间删除空格。唯一的问题是,我不确定如何区分标记之间的空格和标记内的空格。显然,删除标记内的空格会很糟糕。关于我如何辨别差异的任何想法?
示例:(在移除空格之前)
<p>blahblahblah</p> <p>blahblahblah</p>
示例:(删除空格后)
<p>blahblahblah</p><p>blahblahblah</p>
答案 0 :(得分:7)
Rasik发送的链接中的解决方案here它也是您的解决方案
Regex.Replace(html, @"\s*(<[^>]+>)\s*", "$1", RegexOptions.Singleline);
常规采用标记原样和周围的空格字符,并用标记更改。
修改强> 一个适用于Micheal示例的更好的解决方案
Regex.Replace(txtSource.Text,
@"\s*(?<capture><(?<markUp>\w+)>.*<\/\k<markUp>>)\s*", "${capture}", RegexOptions.Singleline);
这个正则表达式将检测标记标记,并且不会更改其内部并删除空格。 还有其他一些案例可供选择。就像没有结束标记的标记一样。
答案 1 :(得分:4)
我正在使用以下内容。在我的脑海中,它的缺点是不处理HTML注释内部和CDATA内部的括号。 HTML中是否还有其他任何不代表标签的尖括号?
public static class HtmlHelper
{
// positive look behind for ">", one or more whitespace (non-greedy), positive lookahead for "<"
private static readonly Regex InsignificantHtmlWhitespace = new Regex(@"(?<=>)\s+?(?=<)");
// Known not to handle HTML comments or CDATA correctly, which we don't use.
public static string RemoveInsignificantHtmlWhiteSpace(string html)
{
return InsignificantHtmlWhitespace.Replace(html, String.Empty).Trim();
}
}
答案 2 :(得分:1)
从技术上讲,所有空间都是某些HTML元素的一部分。例如,最顶层的元素,即文档,“拥有”示例中单独的<p>
节点之间的空格。
所以我想你是否可以删除同一级别节点之间的空间。在这种情况下,您需要跟踪元素嵌套级别和前一个元素。例如,在同一<td>
元素中出现的一系列<tr>
元素,其中您可以检测到一个</td>
的结尾和下一个<td>
元素的开头,并忽略它们之间的所有空格。
您可以简化流程,只需忽略结束</x>
标记与下一个开始标记<y>
之间的任何空格(但这种方法可能会遇到一些困难,我不能想到我的头脑。)
答案 3 :(得分:1)
您可以尝试使用正则表达式去除空白。但是,表达式必须相当复杂才能区分开始标记和结束标记以及处理嵌套标记。
相反,您可以使用类似Html Agility Pack的库来解析HTML输入,然后从文档模型重建HTML字符串。这不仅会消除额外的空白,还会验证HTML(甚至自动纠正常见错误)。
答案 4 :(得分:1)
我的解决方案(类似于Linarize在Notepad ++中的XML Tools插件中的工作方式)
internal static class CONST
{
internal static Regex linarize_regex = new Regex(@"[\r\n]+[\x20\t]*", RegexOptions.CultureInvariant | RegexOptions.Compiled);
internal static Regex tag_linarize_regex = new Regex(@"(?<tag><[^>]*?>)[\r\n]+[\x20\t]*", RegexOptions.CultureInvariant | RegexOptions.Compiled);
}
internal static class UTILS
{
internal static string linarize_html(string html)
{
try
{
html = CONST.tag_linarize_regex.Replace(html, "${tag}");
html = CONST.linarize_regex.Replace(html, " ");
return html;
}
catch (Exception)
{
return html;
}
}
}
答案 5 :(得分:0)
我很想使用正则表达式匹配结束标记和下一个开始标记之间的任何空格。正则表达式模式匹配可以避免你自己编写逻辑。
答案 6 :(得分:-1)
我不确定您使用的是哪种编程语言。但您可以使用 C#使用正则表达式执行以下操作。
public static string TrimSpaces(string str)
{
return System.Text.RegularExpressions.Regex.Replace(str, @"^\s+", string.Empty);
}
另外,查看另一个stackoverflow线程可能会有所帮助。