C# 使用正则表达式修剪html

C# 使用正则表达式修剪html,c#,html,regex,C#,Html,Regex,我想解决这个问题已经有一段时间了 我需要一个正则表达式来去除下面示例中演示的html标记之间的换行符、制表符和空格: 资料来源: <html> <head> <title> Some title </title> </head> </html> 一些头衔 通缉结果: <html><head><title>Some title

我想解决这个问题已经有一段时间了

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

资料来源:

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

一些头衔
通缉结果:

<html><head><title>Some title</title></head></html>
一些标题
“Some title”前面的空格的修剪是可选的。 如果有任何帮助,我将不胜感激

试试这个:

s/[^\w\/\d<>]+/gs
s/[^\w\/\d]+//gs
试试这个:

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

s/>\s+
s/>\s+如果HTML是严格的,请使用XML读取器加载它,然后不格式化地写回。这将保留标记内的空白,但不保留标记之间的空白。

如果HTML是严格的,请使用XML读取器加载它,然后不格式化地写回。这将保留标记内的空白,但不保留它们之间的空白。

s/\s*(]+>)\s*/\1/gs

或者,在c#中:

Regex.Replace(html,“\s*(]+>)\s*”,“$1”,RegexOptions.SingleLine)

s/\s*(]+>)\s*/\1/gs

或者,在c#中:


Regex.Replace(html,“\s*(]+>)\s*”,“$1”,RegexOptions.SingleLine)

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

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

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

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

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

正则表达式根本不擅长解析HTML(请参阅原因)。您需要的是一个HTML解析器。有关使用各种解析器的示例,请参见


您可能会发现这很有帮助。

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

正则表达式根本不擅长解析HTML(请参阅原因)。您需要的是一个HTML解析器。有关使用各种解析器的示例,请参见


你可能会发现这很有用。

我想保留新行,因为删除新行会弄乱我的html。因此,我采取了以下措施

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

我想保留新行,因为删除新行会弄乱我的html。因此,我采取了以下措施

private static string ProcessHTMLFile(string input)
{
    string opt = Regex.Replace(input, @"(  )*", "", RegexOptions.Singleline);
    opt = Regex.Replace(opt, @"[\t]*", "", RegexOptions.Singleline);
    return opt;
}
Regex.Replace(输入“]*>”,String.Empty);
Regex.Replace(输入“]*>”,String.Empty);

使用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>


您可以选择要使用的模板。第一种方法在内容存在时删除所有空白,第二种方法仅在只有空白或换行时删除。

使用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>


您可以选择要使用的模板。第一种方法在内容存在时删除所有空白,第二种方法仅在只有空白或换行时删除。

您如何知道要删除哪些空白?为什么要删除“某个标题”周围的空白,而不是其中的空白?您的规则是什么?如何知道要删除哪些空白?为什么要删除“某个标题”周围的空白,而不是其中的空白?这里的规则是什么?更不用说它不会重新发明轮子。这可能取决于模式。保留标记内的空白是架构定义中的一个特定属性。这一点很重要。试图用正则表达式解析xml/html/其他CFL是不可能100%正确的。更不用说它不会重新发明轮子。这可能取决于模式。保留标记内的空白是架构定义中的一个特定属性。这一点很重要。试图用正则表达式解析xml/html/其他CFL不可能100%正确。第一个字符不能是空格,或者像“if a<3 and b>4”这样的有效html字符串将随表达式一起删除,并且您也不匹配结束标记。不过,您的第一点没有错。这会将“IfA<3和b>4”更改为“IfA4”,如果这是脚本的话,这可能是可以的,但如果它是一篇关于使用空格以提高可读性的文章的文本,那么可能就不可取了。是的,匹配所有html标记内部的]+>有许多边缘大小写。可以使用更完整的模式来代替该子模式,但这说明了基本思想。第一个字符不能是空格,或者像“if a<3 and b>4”这样的有效HTML字符串将与表达式一起删除,并且您也不匹配结尾标记。不过,您的第一点没有错。这会将“IfA<3和b>4”更改为“IfA4”,如果这是脚本的话,这可能是可以的,但如果它是一篇关于使用空格以提高可读性的文章的文本,那么可能就不可取了。是的,匹配所有html标记内部的]+>有许多边缘大小写。可以使用更完整的模式来代替该子模式,但这说明了基本思想。