C# 为html中缺少的标记插入结束标记
如何在缺少结束标记的地方插入结束html标记 像C# 为html中缺少的标记插入结束标记,c#,.net,html,winforms,C#,.net,Html,Winforms,如何在缺少结束标记的地方插入结束html标记 像 索引编号名称 哈里克里希纳 其中有两个缺少的结束标记。即“/tr”。在本例中,如何搜索缺少的标记的位置,以及如何插入适当的结束标记,如“/tr”。如果要处理所有可能的情况,这似乎是一项非常艰巨的任务。HTML不是一种常规语言。我想你应该试着从源头上解决这个问题,那就是你首先是如何得到无效的HTML的。如果你想处理所有可能的情况,这似乎是一个非常棘手的任务。HTML不是一种常规语言。我想你应该试着从源头上解决这个问题,那就是你首先是如何得到无效
索引编号名称
哈里克里希纳
其中有两个缺少的结束标记。即“/tr”。在本例中,如何搜索缺少的标记的位置,以及如何插入适当的结束标记,如“/tr”。如果要处理所有可能的情况,这似乎是一项非常艰巨的任务。HTML不是一种常规语言。我想你应该试着从源头上解决这个问题,那就是你首先是如何得到无效的HTML的。如果你想处理所有可能的情况,这似乎是一个非常棘手的任务。HTML不是一种常规语言。我想你应该试着从源头上解决这个问题,那就是你首先是如何得到无效的HTML的。你可以看看它是否适合你的需要。你可以看看它是否适合你的需要。我不能对上面的内容发表评论,所以我在这里记下。您还可以使用HTML-Tidy清理HTML片段。请参见此处的示例:
HTML Tidy的另一种替代方法是使用正则表达式清理输出代码。然而,请注意,尽管这在处理方面可能更快,但它并不像HTML Tidy那样具有通用性和健壮性(维护方面) 代码
<?php
$html = "
<table>
<tr class=\"lorem\">
<td>Index No.</td>
<td>Name</td>
<tr>
<td>0</td>
<td>FooBaz</td>
<tr>
<td>1</td>
<td>Harikrishna</td>
<tr class=\"ipsum\">
<td>2</td>
<td>Foo</td>
</tr>
<tr>
<td>3</td>
<td>Bar</td>
</table>
";
// regex magic
$start_cond = "<tr(?:\s[^>]*)?>";
$end_cond = "(?:{$start_cond}|<\/table>)";
$row_contents = "(?:(?!{$end_cond}).)*";
// first remove all </tr> tags
$xhtml = preg_replace( "/<\/tr>/ism", "", $html );
// now re-add </tr> tags where appropriate
$xhtml = preg_replace( "/({$start_cond})({$row_contents})/ism", "$1$2</tr>\n", $xhtml );
// ignore: just for writing comparision output
echo "<h2>Before:</h2>"; show_count( $html );
echo "<h2>After</h2>"; show_count( $xhtml );
function cmp($patt,$html) {
$count = preg_match_all( "/{$patt}/ism", $html, $matches);
return htmlentities("\n{$count} x {$patt}");
}
function show_count($html) {
echo "<pre>"
. cmp("<tr(\s[^>]*)?>",$html)
. cmp("<\/tr>",$html)
. "</pre>";
}
?>
输出
之前:
5 x]*)?>
1倍
之后
5 x]*)?>
5倍
我无法对上述内容发表评论,因此我将在此处加以说明。您还可以使用HTML-Tidy清理HTML片段。请参见此处的示例:HTML Tidy的另一种替代方法是使用正则表达式清理输出代码。然而,请注意,尽管这在处理方面可能更快,但它并不像HTML Tidy那样具有通用性和健壮性(维护方面) 代码
<?php
$html = "
<table>
<tr class=\"lorem\">
<td>Index No.</td>
<td>Name</td>
<tr>
<td>0</td>
<td>FooBaz</td>
<tr>
<td>1</td>
<td>Harikrishna</td>
<tr class=\"ipsum\">
<td>2</td>
<td>Foo</td>
</tr>
<tr>
<td>3</td>
<td>Bar</td>
</table>
";
// regex magic
$start_cond = "<tr(?:\s[^>]*)?>";
$end_cond = "(?:{$start_cond}|<\/table>)";
$row_contents = "(?:(?!{$end_cond}).)*";
// first remove all </tr> tags
$xhtml = preg_replace( "/<\/tr>/ism", "", $html );
// now re-add </tr> tags where appropriate
$xhtml = preg_replace( "/({$start_cond})({$row_contents})/ism", "$1$2</tr>\n", $xhtml );
// ignore: just for writing comparision output
echo "<h2>Before:</h2>"; show_count( $html );
echo "<h2>After</h2>"; show_count( $xhtml );
function cmp($patt,$html) {
$count = preg_match_all( "/{$patt}/ism", $html, $matches);
return htmlentities("\n{$count} x {$patt}");
}
function show_count($html) {
echo "<pre>"
. cmp("<tr(\s[^>]*)?>",$html)
. cmp("<\/tr>",$html)
. "</pre>";
}
?>
输出
之前:
5 x]*)?>
1倍
之后
5 x]*)?>
5倍
@Dav,我想编写代码,以便在缺少结束标记的地方插入结束标记。@nobugz,HTML-Tidy是一个工具或源代码,我们可以重新生成HTML源代码。如果它是一个工具,那么我们可以编写什么代码来插入缺少的结束标记?@Dav,我想编写代码,以便在缺少结束标记的地方插入结束标记。@nobugz,HTML Tidy是一个工具或源代码,我们可以从中重新生成HTML源代码。如果它是一个工具,那么我们可以编写什么代码来插入缺少的结束标记?@Darin Dimitro,什么是IMHO?@Harikrishna,以我的拙见。我正在使用Html Agility Pack解析Html内容。如果任何Html文件缺少标记,则解析操作不正确。Html Agility Pack是否可以帮助在缺少结束标记的地方插入结束标记?@Darin Dimitro,什么是IMHO?@Harikrishna,以我的拙见。我正在使用Html Agility Pack来解析Html内容。如果任何Html文件缺少标记,那么解析就没有正确完成。Html Agility Pack能否帮助在缺少结束标记的地方插入结束标记?很抱歉,但我恐怕没有。上面的例子是在PHP中,但是正则表达式和执行此操作的逻辑应该基本相同,而不管使用哪种语言,只要该语言支持常用的PCRE语法(PCRE=Perl兼容正则表达式)。很抱歉,我恐怕不支持。上面的例子是用PHP编写的,但是无论使用哪种语言,正则表达式和执行该操作的逻辑应该基本相同,前提是该语言支持常用的PCRE语法(PCRE=Perl兼容正则表达式)。
Before:
5 x <tr(\s[^>]*)?>
1 x <\/tr>
After
5 x <tr(\s[^>]*)?>
5 x <\/tr>