使用正则表达式修剪html

时间:2009-06-02 17:51:22

标签: c# html regex

现在试图解决这个问题。

我需要一个正则表达式去除下面示例中演示的html标记之间的换行符,制表符和空格:

来源:

<html>
   <head>
     <title>
           Some title
       </title>
    </head>
</html>

通缉结果:

<html><head><title>Some title</title></head></html>

在“Some title”之前修剪空白是可选的。 我很感激任何帮助

9 个答案:

答案 0 :(得分:20)

如果HTML是严格的,请使用XML阅读器加载它并将其写回而不进行格式化。这将保留标签内的空白,但不保留它们之间的空白。

答案 1 :(得分:1)

\ d仅与Perl 5.8和5.10中的[0-9]不匹配;它匹配任何具有digit属性的UNICODE字符(包括“\ x {1815}”和“\ x {FF15}”)。如果你的意思是[0-9]你必须使用[0-9]或使用字节编译指示(但是它会以1个字节的字符转换所有字符串,通常不是你想要的)。

正则表达式在解析HTML方面根本不好(请参阅Can you provide some examples of why it is hard to parse XML and HTML with a regex?了解原因)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅Can you provide an example of parsing HTML with your favorite parser?

您可能会发现HTMLAgilityPack answer有帮助。

答案 2 :(得分:0)

试试这个:

s/[^\w\/\d<>]+/gs

答案 3 :(得分:0)

s/>\s+</></gs

答案 4 :(得分:0)

s/\s*(<[^>]+>)\s*/\1/gs

或者,在c#中:

Regex.Replace(html, "\s*(<[^>]+>)\s*", "$1", RegexOptions.SingleLine);

答案 5 :(得分:0)

这将删除标记之间的空格以及标记和文本之间的空格。

s/(\s*(<))|((>)\s*)/\2\4/g

答案 6 :(得分:0)

Regex.Replace(input, "<[^>]*>", String.Empty);

答案 7 :(得分:0)

使用XSLT的解决方案如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">    
<xsl:output  method="xml" encoding="UTF-8" indent="no"/>

<xsl:template match="*|@*">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<!-- trim whitespaces from the content -->
<xsl:template match="text()">
    <!-- remove from tag to content -->
    <xsl:variable name="trimmedHead" select="replace(.,'^\s+','')"/>
    <xsl:variable name="trimmed" select="replace($trimmedHead,'\s+$','')"/>
    <xsl:value-of select="$trimmed"/>
</xsl:template>

<!-- do not trim where text content exist -->
<xsl:template match="text()">
    <xsl:if test="not(matches(.,'^\s+$'))">
        <xsl:value-of select="."/>
    </xsl:if>
</xsl:template>

您可以选择要使用的模板。当内容存在时,第一个删除所有空格,第二个仅在只有空格或换行符时删除。

答案 8 :(得分:-1)

我想保留新行,因为删除换行符会弄乱我的HTML。所以我选择以下内容。

private static string ProcessHTMLFile(string input)
{
    string opt = Regex.Replace(input, @"(  )*", "", RegexOptions.Singleline);
    opt = Regex.Replace(opt, @"[\t]*", "", RegexOptions.Singleline);
    return opt;
}