在html中插入缺少标记的结束标记

时间:2010-03-20 08:53:33

标签: c# .net html winforms

如何在缺少结束标记的地方插入结束的html标记?

喜欢

 <tr>
 <td>Index No.</td><td>Name</td>

 <tr>
 <td>1</td><td>Harikrishna</td>

其中两个缺少结束标记。这是“/ tr”。在这种情况下,如何搜索缺失标记的位置以及如何插入适当的结束标记,如“/ tr”。

3 个答案:

答案 0 :(得分:2)

如果您想处理所有可能的情况,这似乎是一项非常艰巨的任务。 HTML不是常规语言。恕我直言,你应该尝试在源头解决问题,这首先是你得到无效的HTML。

答案 1 :(得分:1)

您可以查看HTML Tidy,看看它是否适用于您需要的内容。

答案 2 :(得分:1)

我不能对上述内容发表评论,所以我会在这里注意。您也可以使用 HTML Tidy 来清理HTML片段。请参阅此处的示例:
http://www.php.net/manual/en/tidy.examples.basic.php

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>";
}
?>

<强>输出


Before:
5 x <tr(\s[^>]*)?>
1 x <\/tr>

After
5 x <tr(\s[^>]*)?>
5 x <\/tr>