Ищете PHP-скрипт, который может очистить плохой HTML


Я нахожусь в процессе написания сценария командной строки PHP для преобразования сотен фрагментов HTML в Markdown с использованием библиотеки Markdownify. Однако я столкнулся с ситуацией, когда часть моего HTML-кода недостаточно хорошо структурирована для использования с Markdownify. Поэтому сначала мне нужно отправить свой HTML-код через какую-нибудь библиотеку, которая может его очистить и добавить дополнительные закрывающие теги и т.д. Я буду работать с частичными блоками HTML, а не с полными HTML-документами, поэтому возвращаемый HTML должен быть частичным (и не включать доктип и т. Д.).

Знаете ли вы PHP-скрипт, который может конвертировать HTML в XHTML?

Решение:

Используйте класс PHP DOMDocument. Он отформатирует ваш HTML-код, даже если он сломан. Затем вы можете извлечь очищенный HTML:

libxml_use_internal_errors(true); //use this to prevent warning messages from displaying because of the bad HTML

$doc = new DOMDocument();
$doc->loadHTML($badHtml);
$goodHtml = $doc->saveHTML();

Это вернет полный HTML-документ (с очищенной версией в теге body), хотя я передал ему частичный блок HTML, поэтому я могу извлечь очищенную часть с помощью этого регулярное выражение:

$goodHtmlPartial = trim(ereg_replace('(.*)<body>(.*)</body>(.*)', '\2', $goodHtml));
Author: Andrew, 2010-12-08

6 answers

Вы можете загрузить HTML-код в DOM, а затем сохранить в виде XML.

 5
Author: Phil, 2010-12-08 00:24:16

Есть ли причины не использовать tidy?

Http://php.net/manual/en/book.tidy.php

Он может очистить ваш html-код и предоставить вам только раздел тела.

$tidy = tidy_repair_string($content,array(
                           'indent'         => true,
                           'output-html'   => true,
                           'wrap'           => 80,
                           'show-body-only' => true,
                           'clean' => true,
                           'input-encoding' => 'utf8',
                           'output-encoding' => 'utf8',
                           'logical-emphasis' => false,
                           'bare' => true,
                                          ));
 8
Author: Yisrael Dov, 2013-01-31 09:11:24

Попробуйте Очиститель HTML; он отлично справляется с очисткой плохого HTML и также может служить фильтром для потенциально вредоносного кода.

 4
Author: El Yobo, 2010-12-08 00:34:56

Я бы предложил вам использовать метод DOMDocument->loadHTML(). Он отформатирует ваш HTML-код, даже если он сломан. Позже вы можете сохранить его в формате XML, чтобы получить XHTML.

 2
Author: Utku Zihnioglu, 2010-12-08 00:39:20

Не PHP, но в библиотеке BeautifulSoup для python есть парсеры, которые хороши для создания допустимого html практически для любого старого дерьма.

 0
Author: Tyler Eaves, 2010-12-08 00:21:59
                    libxml_use_internal_errors(true);

                    $dom = new \DOMDocument;
                    $dom->loadHTML($bad_html);

                    // Strip wrapping <html> and <body> tags
                    $mock = new \DOMDocument;
                    $body = $dom->getElementsByTagName('body')->item(0);
                    foreach ($body->childNodes as $child) {
                        $mock->appendChild($mock->importNode($child, true));
                    }

                    $fixed = trim($mock->saveHTML());
                    echo $fixed;
 0
Author: oasisfleeting, 2018-04-04 20:34:02