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