C# 使用正则表达式修剪html
我想解决这个问题已经有一段时间了 我需要一个正则表达式来去除下面示例中演示的html标记之间的换行符、制表符和空格: 资料来源:C# 使用正则表达式修剪html,c#,html,regex,C#,Html,Regex,我想解决这个问题已经有一段时间了 我需要一个正则表达式来去除下面示例中演示的html标记之间的换行符、制表符和空格: 资料来源: <html> <head> <title> Some title </title> </head> </html> 一些头衔 通缉结果: <html><head><title>Some title
<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标记内部的]+>有许多边缘大小写。可以使用更完整的模式来代替该子模式,但这说明了基本思想。