C# 我可以使用什么方式的正则表达式在HTML标记附近添加换行符?
我有以下正则表达式,用于在HTML字符串中提供标记:C# 我可以使用什么方式的正则表达式在HTML标记附近添加换行符?,c#,html,regex,C#,Html,Regex,我有以下正则表达式,用于在HTML字符串中提供标记: <[^>]*> ]*> 因此,如果我通过以下内容: <b> Bold </b> matches[0] = <b> matches[1] = Bold matches[2] = </b> matches[3] = This is the stuff matches[4] = <i> matches[5] = Italic matches[6] = </
<[^>]*>
]*>
因此,如果我通过以下内容:
<b> Bold </b>
matches[0] = <b>
matches[1] = Bold
matches[2] = </b>
matches[3] = This is the stuff
matches[4] = <i>
matches[5] = Italic
matches[6] = </i>
粗体
然后它会给我:
<b>
</b>
<b>
Bold
</b>
我怎样才能让它给我:
<b>
</b>
<b>
Bold
</b>
大胆的
更新:
下面是另一个了解全局的示例:
如果这是文本:
<b>Bold</b> This is the stuff <i>Italic</i>
Bold这是斜体的东西
那么最终结果将是:
<b> Bold </b>
matches[0] = <b>
matches[1] = Bold
matches[2] = </b>
matches[3] = This is the stuff
matches[4] = <i>
matches[5] = Italic
matches[6] = </i>
匹配[0]=
匹配[1]=粗体
匹配项[2]=
匹配项[3]=这是东西
匹配项[4]=
匹配[5]=斜体
匹配项[6]=
不要使用正则表达式解析HTML。,因此正则表达式根本不适合解析HTML。改用HTML或XML解析器。在线上有许多(HT | X)ML解析器可用。你用什么语言
由于语言的复杂性,您将无法创建与HTML匹配的正则表达式。Regex操作的语言类小于HTML所属的语言类。您尝试编写的任何正则表达式都很难理解,而且不正确
改用XPath之类的东西
编辑:您正在使用C#。幸运的是,你有一个完整的可用的。另外,如果您的HTML不严格,还可以使用其他库来解析HTML。如果您对正则表达式的使用支持反向引用,则可以使用
*?
。这在perl中是有效的。Html标记是Regex最大的难题之一。您必须小心,因为如果您在同一行上有多个标记,或者取决于您对它的求值方式,仅匹配第一个和最后一个标记是不够的
这里有一个像样的表达你可以使用
@"<(?<tag>\w*)>(?<text>.*)</\k<tag>>"
@(?*)
您将拥有命名组标记和文本,可用于访问您拥有的值。使用这些值,您可以格式化您的应用程序。根据您的语言,您可能需要指定将整个字符串作为一行进行搜索。如果输入是XHTML,那么它也是合法的XML,因此您可以使用一些简单的XSLT来完成所有这一切。我支持不使用正则表达式的建议;html不能用常规语言正确表达 最好研究System.Xml.XmlReader和System.Web.HtmlWriter。您应该能够编写一个函数,从读卡器读取元素,然后将其写入写卡器;类似于
public static string HtmlReformat(string html)
{
var sw = new StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(sw);
XmlReader rdr = XmlReader.Create(new StringReader(html));
while (rdr.Read())
{
switch (rdr.NodeType)
{
case XmlNodeType.EndElement:
htmlWriter.WriteEndTag(rdr.Name);
htmlWriter.Write(System.Environment.NewLine);
break;
case XmlNodeType.Element:
htmlWriter.WriteBeginTag(rdr.Name);
for (int attributeIdx = 0; attributeIdx < rdr.AttributeCount; attributeIdx++)
{
string attribName = rdr.GetAttribute(attributeIdx);
htmlWriter.WriteAttribute(rdr.Name, attribName);
}
htmlWriter.Write(">");
htmlWriter.Write(System.Environment.NewLine);
break;
case XmlNodeType.Text:
htmlWriter.Write(rdr.Value);
break;
default:
throw new NotImplementedException("Handle " + rdr.NodeType);
}
}
return sw.ToString();
}
公共静态字符串HtmlReformat(字符串html)
{
var sw=新的StringWriter();
HtmlTextWriter htmlWriter=新的HtmlTextWriter(sw);
XmlReader rdr=XmlReader.Create(新的StringReader(html));
while(rdr.Read())
{
开关(rdr.NodeType)
{
案例XmlNodeType.EndElement:
htmlWriter.writendtag(rdr.Name);
Write(System.Environment.NewLine);
打破
case XmlNodeType.Element:
htmlWriter.WriteBeginTag(rdr.Name);
for(int attributedIdX=0;attributedIdX”);
Write(System.Environment.NewLine);
打破
案例XmlNodeType.Text:
htmlWriter.Write(rdr.Value);
打破
违约:
抛出新的NotImplementedException(“句柄”+rdr.NodeType);
}
}
返回sw.ToString();
}
无论如何,这应该给你一个工作的基础。答案是不要使用正则表达式来解析HTML。你用什么语言来做这件事?我可以为您指出一些HTML解析器,它们适用于您调用此正则表达式的任何语言。我正在使用c语言,目前正在研究@azamsharp:我推荐HTML Agility Pack用于以下内容:@Luke,HtmlAgilityPack对于我需要执行的简单任务来说可能非常复杂。@azamsharp:如果您使用的是C#,那么请查看HTML敏捷包:上面的表达式只给出了一个大的搜索结果,即传递给它的完整字符串。啊,您的示例显示了一个标记。这改变了答案。我真的不明白这些投票结果——问题是“我如何改变正则表达式?我必须做些别的事情”。我从实现的角度理解,正则表达式不是解析HTML的方法,但很多情况下,学习的是在现实环境之外演示想法。我回答了这个问题——只是不要投赞成票。