Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使用什么方式的正则表达式在HTML标记附近添加换行符?_C#_Html_Regex - Fatal编程技术网

C# 我可以使用什么方式的正则表达式在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] = </

我有以下正则表达式,用于在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] = </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的方法,但很多情况下,学习的是在现实环境之外演示想法。我回答了这个问题——只是不要投赞成票。