Ищите сценарий PHP, который может очистить плохой HTML - PullRequest
7 голосов
/ 08 декабря 2010

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

Вам известен сценарий PHP, который может конвертировать HTML в XHTML?

Решение:

Использование PHP DOMDocument class.Он отформатирует ваш 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 ]

8 голосов
/ 28 октября 2012

Есть ли причина не использовать приборку?

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,
                                          ));
5 голосов
/ 08 декабря 2010

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

4 голосов
/ 08 декабря 2010

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

2 голосов
/ 08 декабря 2010

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

0 голосов
/ 04 апреля 2018
                    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 голосов
/ 08 декабря 2010

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

...