Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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#_.net_Html_Winforms - Fatal编程技术网

C# 为html中缺少的标记插入结束标记

C# 为html中缺少的标记插入结束标记,c#,.net,html,winforms,C#,.net,Html,Winforms,如何在缺少结束标记的地方插入结束html标记 像 索引编号名称 哈里克里希纳 其中有两个缺少的结束标记。即“/tr”。在本例中,如何搜索缺少的标记的位置,以及如何插入适当的结束标记,如“/tr”。如果要处理所有可能的情况,这似乎是一项非常艰巨的任务。HTML不是一种常规语言。我想你应该试着从源头上解决这个问题,那就是你首先是如何得到无效的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>