Разбор плохо отформатированного HTML в PHP - PullRequest
9 голосов
/ 28 февраля 2010

В своем коде я конвертирую некоторые стилизованные документы в формате xls в html, используя openoffice. Затем я анализирую таблицы, используя xml_parser_create. Проблема в том, что openoffice создает oldschool html с незамкнутыми тегами <BR> и <HR>, не создает типы документов и не заключает в кавычки атрибуты <TABLE WIDTH=4>.

Парсерам php, которые я знаю, это не нравится, и они приводят к ошибкам форматирования xml. Мое текущее решение состоит в том, чтобы запустить несколько регулярных выражений над файлом, прежде чем я его проанализирую, но это ни приятно, ни быстро.

Знаете ли вы (надеюсь, что он включен) php-парсер, который не заботится о подобных ошибках? Или, возможно, быстрый способ исправить «сломанный» HTML?

Ответы [ 4 ]

8 голосов
/ 28 февраля 2010

Решением "исправить" поврежденный HTML может быть использование HTMLPurifier (цитирование) :

HTML Purifier соответствует стандартам Библиотека HTML-фильтров написана на PHP.
HTML Purifier не только удалит весь вредоносный код (более известный как XSS) с тщательно проверенным, безопасный, но разрешающий белый список также обеспечит соответствие ваших документов стандартам


Альтернативной идеей может быть попытка загрузить ваш HTML с DOMDocument::loadHTML (цитирование) :

Функция анализирует содержащийся HTML в строке источника. В отличие от загрузки XML, HTML не должен быть правильно сформированный для загрузки.

А если вы пытаетесь загрузить HTML из файла, см. DOMDocument::loadHTMLFile.

4 голосов
/ 28 февраля 2010

Есть SimpleHTML

Для исправления поврежденного HTML вы можете использовать Tidy .

В качестве альтернативы вы можете использовать собственный XML Reader . Поскольку он действует как курсор, идущий вперед по потоку документов и останавливающийся на каждом узле в пути, он не будет нарушать недействительные документы XML.

См. http://www.ibm.com/developerworks/library/x-pullparsingphp.html

1 голос
/ 28 февраля 2010

По какой-то конкретной причине вы все еще используете PHP 4 XML API?

Если вы можете использовать XML API PHP 5, у вас есть две возможности.

Сначала попробуйте встроенный анализатор HTML. Это на самом деле не очень хорошо (это имеет тенденцию подавлять плохо отформатированный HTML), но это может помочь. Взгляните на DomDocument :: LoadHTML.

Второй вариант - вы можете попробовать парсер HTML на основе спецификации парсера HTML5:

http://code.google.com/p/html5lib/

Это работает лучше, чем встроенный PHP HTML-парсер. Он загружает HTML-код в объект DomDocument.

0 голосов
/ 11 января 2017

Решением является использование DOMDocument.

Пример:

$str = "
<html>
 <head>
  <title>test</title>
 </head>
 <body>
  </div>error.
  <p>another error</i>
 </body>
</html>
";

$doc = new DOMDocument();
@$doc->loadHTML($str);
echo $doc->saveHTML();

Преимущество: изначально включено в PHP, в отличие от PHP Tidy.

...