如何在缺少结束标记的地方插入结束的html标记?
喜欢
<tr>
<td>Index No.</td><td>Name</td>
<tr>
<td>1</td><td>Harikrishna</td>
其中两个缺少结束标记。这是“/ tr”。在这种情况下,如何搜索缺失标记的位置以及如何插入适当的结束标记,如“/ tr”。
答案 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>