Вставка конечных тегов для отсутствующих тегов в HTML - PullRequest
0 голосов
/ 20 марта 2010

Как вставить конечные html-теги там, где отсутствуют конечные теги?

Как и

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

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

Где два отсутствующих конечных тега. Это "/tr". Теперь в этом случае как искать, где отсутствующий тег и как вставить соответствующий конечный тег, напримерas "/tr".

Ответы [ 3 ]

2 голосов
/ 20 марта 2010

Это кажется очень трудной задачей, если вы хотите обработать все возможные случаи.HTML не является обычным языком.ИМХО, вы должны попытаться решить проблему в источнике, как, в первую очередь, вы получили недопустимый HTML.

1 голос
/ 21 марта 2010

Я не могу комментировать вышесказанное, поэтому я отмечу это здесь. Вы можете использовать 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>
1 голос
/ 20 марта 2010

Вы можете взглянуть на HTML Tidy и посмотреть, работает ли он для того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...