Я не могу комментировать вышесказанное, поэтому я отмечу это здесь. Вы можете использовать HTML Tidy также для очистки HTML-фрагментов. Смотрите примеры здесь:
http://www.php.net/manual/en/tidy.examples.basic.php
Альтернативой HTML Tidy является очистка вашего выходного кода с помощью регулярных выражений - ниже приведен пример. Тем не менее, обратите внимание, что, хотя это может быть быстрее с точки зрения обработки, оно не настолько универсально, не надежно (в плане обслуживания), как HTML Tidy.
код
<code><?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)
. "
";
}
?>
выход
<b>Before:</b>
5 x <tr(\s[^>]*)?>
1 x <\/tr>
<b>After</b>
5 x <tr(\s[^>]*)?>
5 x <\/tr>