我目前正在开发一个程序,允许我将HTML源代码输入到RichTextBox控件中,并从标记之间删除空格。唯一的问题是,我不确定如何区分标记之间的空格和标记内的空格。显然,删除标记内的空格会很糟糕。关于我如何辨别差异的任何想法?
示例:(在移除空格之前)
<p>blahblahblah</p> <p>blahblahblah</p>
示例:(删除空格后)
<p>blahblahblah</p><p>blahblahblah</p>
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);
这个正则表达式将检测标记标记,不要改变它的内部并删除空格。还有其他一些案例可供选择。就像没有结束标记的标记一样。
我正在使用以下内容。在我的脑海中,它的缺点是不处理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();
}
}
从技术上讲,所有空格都是HTML元素的一部分。例如,最顶层的元素,即文档,“拥有”示例中的separate<p>
nodes之间的空格。
所以我想你是否可以删除同一级别节点之间的空间。在这种情况下,您需要跟踪元素嵌套级别和前一个元素。例如,在same<td>
element中出现的一系列<tr>
elements,其中你可以检测oneqazxswpo的结尾和next</td>
element的开头,并忽略它们之间的所有空格。
您可以简化该过程并简单地忽略closing<td>
tag和下一个开始tag</x>
之间的任何空格(但是这种方法可能存在一些困难,我无法想到这一点)。
您可以尝试使用正则表达式去除空白。但是,表达式必须相当复杂才能区分开始标记和结束标记以及处理嵌套标记。
相反,您可以使用像<y>
这样的库来解析HTML输入,然后从文档模型重建HTML字符串。这不仅会消除额外的空白区域,还会验证HTML(甚至自动纠正常见错误)。
我的解决方案(类似于Linarize在Notepad ++中的XML Tools插件中的工作方式)
Html Agility Pack
我很想使用正则表达式匹配结束标记和下一个开始标记之间的任何空格。正则表达式模式匹配将避免您必须自己编写逻辑。
我不确定您使用的是哪种编程语言。但是您可以使用正则表达式在C#中执行以下操作。
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;
}
}
}
另外,查看另一个stackoverflow线程可能会有所帮助。
public static string TrimSpaces(string str)
{
return System.Text.RegularExpressions.Regex.Replace(str, @"^\s+", string.Empty);
}