Ищете 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));
6 answers
Есть ли причины не использовать 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,
));
Попробуйте Очиститель HTML; он отлично справляется с очисткой плохого HTML и также может служить фильтром для потенциально вредоносного кода.
Я бы предложил вам использовать метод DOMDocument->loadHTML(). Он отформатирует ваш HTML-код, даже если он сломан. Позже вы можете сохранить его в формате XML, чтобы получить XHTML.
Не PHP, но в библиотеке BeautifulSoup для python есть парсеры, которые хороши для создания допустимого html практически для любого старого дерьма.
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;