C# 删除不完整的P标记(使用正则表达式或任何其他方法)

C# 删除不完整的P标记(使用正则表达式或任何其他方法),c#,.net,regex,visual-studio,parsing,C#,.net,Regex,Visual Studio,Parsing,我的问题有点特殊 首先, 它只适用于标记,不适用于任何其他标记。因此,您不必担心任何其他标记 我有一个html文档,它是一个软件的输出,但是它有一些错误,比如未关闭的标记 例如。 我把所有的文件都放在一个字符串中 我的文件是 <html> .... .... <head> </head> .... .... <body> ... ... <

我的问题有点特殊

首先,

它只适用于
标记,不适用于任何其他标记。因此,您不必担心任何其他标记

我有一个html文档,它是一个软件的输出,但是它有一些错误,比如未关闭的
标记

例如。 我把所有的文件都放在一个字符串中

我的文件是

    <html>
    ....
    ....
      <head>
      </head>
    ....
    ....
       <body>

    ...
    ...
    <p>                 // tag is to be removed as no closing tag

<p align="left">   AAA   </p>
<p class="style6">   BBB    </P>
<p class="style1" align="center">    CCC    </P>

<p align="left">  DDD               // tag is to be removed as no closing tag
<p class="style6">   EEE              // tag is to be removed as no closing tag
<p class="style1" align="center">    FFF             // tag is to be removed as no closing tag

<p class="style15"><strong>xxyyzz</strong><br/></p>

<p>                // tag is to be removed as no closing tag



<p> stack Overflow </P>


       <body>
      </html>

....
....
....
....
...
...
//标记将被删除,因为没有结束标记

AAA

BBB

CCC

DDD//标记将被删除,因为没有结束标记

EEE//标记将被删除,因为没有结束标记

FFF//标记将被删除,因为没有结束标记

xxyyz

//标记将被删除,因为没有结束标记 堆栈溢出

带有DDD、EEE、FFF和未闭合标签的标签将被移除 正如您所见,它应该适用于每个未关闭的

标记,无论它是否具有class或align等属性

我还想提到的是,我的意思是,在另一个
标记中没有
标记

<p>
    <p>
    </p>

     <p>
     </p>

</p>


这种情况永远不会发生

我尝试使用正则表达式和StringBuilder,但无法得到完美的答案

对于那些愿意帮助的人,Thanx会提前很多


关于您可以使用获得更好的结果:

它是一个.NET代码库,允许 您需要解析“web外”HTML 档案解析器非常宽容 使用“真实世界”格式错误的HTML。 对象模型非常类似于什么 建议使用System.Xml,但适用于HTML


只需将文档加载到DOM中,对元素进行迭代以查找
,并将其过滤掉,就像进行有效的XML操作一样。

使用可能会获得更好的结果:

它是一个.NET代码库,允许 您需要解析“web外”HTML 档案解析器非常宽容 使用“真实世界”格式错误的HTML。 对象模型非常类似于什么 建议使用System.Xml,但适用于HTML


只需将文档加载到DOM中,对元素进行迭代以查找
,并将其过滤掉,就像您正在进行有效的XML操作一样。

首先,请查看。如果这并没有阻止您使用正则表达式解析HTML(因为我知道这是一个非常特殊的情况,可能无法保证使用完整的DOM解析器,即使这是绝对最好的推荐方式),我已经发布了一个类似问题的答案;你可以很容易地根据你的情况调整它,但请理解,这不是推荐的,如果你决定使用它,很多事情可能会出错(包括,如上面第一个链接所述,宇宙末日等:P)


如果我指给你的正则表达式看起来太复杂,或者你在理解或简化它时遇到问题,请发表评论,我会补充更多说明。

首先,请看一看。如果这并没有阻止您使用正则表达式解析HTML(因为我知道这是一个非常特殊的情况,可能无法保证使用完整的DOM解析器,即使这是绝对最好的推荐方式),我已经发布了一个类似问题的答案;你可以很容易地根据你的情况调整它,但请理解,这不是推荐的,如果你决定使用它,很多事情可能会出错(包括,如上面第一个链接所述,宇宙末日等:P)


如果我指给你的正则表达式看起来太复杂,或者你在理解或简化它时遇到问题,请发表评论,我将补充更多说明。

免责声明:请注意,我不主张尝试使用正则表达式或简单的子字符串匹配解析任意HTML。下面的解决方案是针对这个特定问题的,它似乎被有意地限制为使用简单的方法进行解析。一般来说,我同意共识:要解析HTML,请使用HTML解析器

也就是说

考虑到嵌套的
标记是不允许的,并且假设不允许任何HTML注释,在循环中执行以下操作应该相对容易,以查找并消除所有没有相应
标记

string inputText = GetHtmlText();
int scanPos = 0;
int startTag = inputText.IndexOf("<p>", scanPos);
while (startTag != -1)
{
    scanPos += 4;
    // Now look for a closing tag or another open tag
    int closeTag = inputText.IndexOf("</p">, scanPos);
    int nextStartTag = inputText.IndexOf("<p>", scanPos);
    if (closeTag == -1 || nextStartTag < closeTag)
    {
        // Error at position startTag.  No closing tag.
    }
    else
    {
        // You have a full paragraph between startTag and (closeTag+5).
    }
    startTag = nextStartTag;
}
string inputText=GetHtmlText();
int-scanPos=0;
int startTag=inputText.IndexOf(“”,scanPos);
while(startTag!=-1)
{
scanPos+=4;
//现在查找结束标记或另一个打开标记

int closeTag=inputText.IndexOf("免责声明:请注意,我不主张尝试使用正则表达式或简单的子字符串匹配来解析任意HTML。下面的解决方案是针对这个特定问题的,它似乎有意限制使用简单的方法来解析。一般来说,我同意共识:要解析HTML,请使用HTML解析器。

也就是说

考虑到嵌套的
标记是不允许的,并且假设不允许任何HTML注释,在循环中执行以下操作应该相对容易,以查找并消除所有没有相应
标记

string inputText = GetHtmlText();
int scanPos = 0;
int startTag = inputText.IndexOf("<p>", scanPos);
while (startTag != -1)
{
    scanPos += 4;
    // Now look for a closing tag or another open tag
    int closeTag = inputText.IndexOf("</p">, scanPos);
    int nextStartTag = inputText.IndexOf("<p>", scanPos);
    if (closeTag == -1 || nextStartTag < closeTag)
    {
        // Error at position startTag.  No closing tag.
    }
    else
    {
        // You have a full paragraph between startTag and (closeTag+5).
    }
    startTag = nextStartTag;
}
string inputText=GetHtmlText();
int-scanPos=0;
int startTag=inputText.IndexOf(“”,scanPos);
while(startTag!=-1)
{
scanPos+=4;
//现在查找结束标记或另一个打开标记

int closeTag=inputText.IndexOf(“我真的很感谢你们所有人的帮助,特别是JIM n ALEX。。 我试过了,效果很好。很多

 public static string CleanUpXHTML(string xhtml)
            {
                int pOpen = 0, pClose = 0, pSlash = 0, pNext = 0, length = 0;
                pOpen = xhtml.IndexOf("<p", 0);
                pClose = xhtml.IndexOf(">", pOpen);
                pSlash = xhtml.IndexOf("</p>", pClose);
                pNext = xhtml.IndexOf("<p", pClose);

                while (pSlash > -1)
                {


                    if (pSlash < pNext)
                    {
                        if (pSlash < pNext)
                        {
                            pOpen = pNext;
                            pClose = xhtml.IndexOf(">", pOpen);
                            pSlash = xhtml.IndexOf("</p>", pClose);
                            pNext = xhtml.IndexOf("<p", pClose);
                        }
                    }
                    else
                    {
                        length = pClose - pOpen + 1;
                        if (pNext < 0 && pSlash > 0)
                        {
                            break;
                        }


                        xhtml = xhtml.Remove(pOpen, length);

                        pOpen = pNext - length;
                        pClose = xhtml.IndexOf(">", pOpen);
                        pSlash = xhtml.IndexOf("</p>", pClose);
                        pNext = xhtml.IndexOf("<p", pClose);


                    }

                    if (pSlash < 0)
                    {
                        int lastp = 0, lastclosep = 0, lastnextp = 0, length3 = 0, TpSlash =0 ;

                        lastp = xhtml.IndexOf("<p",pOpen-1);

                        lastclosep = xhtml.IndexOf(">", lastp);
                        lastnextp = xhtml.IndexOf("<p", lastclosep);


                        while (lastp >0)
                        {
                            length3 = lastclosep - lastp + 1;
                            xhtml = xhtml.Remove(lastp, length3);
                            if (lastnextp < 0)
                            {
                                break;
                            }
                            lastp = lastnextp-length3;
                            lastclosep = xhtml.IndexOf(">", lastp);
                            lastnextp = xhtml.IndexOf("<p", lastclosep);

                        }

                        break;
                    }

                }

                return xhtml;

            }
publicstaticstringcleanupxhtml(st