В моем коде я конвертирую некоторый стиль xls document в html с помощью openoffice. Затем я разбираю таблицы с помощью xml_parser_create
. Проблема в том, что openoffice создает oldschool html с незакрытыми тегами <BR>
и <HR>
, он не создает doctypes и не цитирует атрибуты <TABLE WIDTH=4>
.
Анализаторы php, которых я знаю, не нравятся, и дают ошибки форматирования xml. Мое текущее решение состоит в том, чтобы запускать некоторые регулярные выражения над файлом, прежде чем разбирать его, но это не является ни хорошим, ни быстрым.
Знаете ли вы (надеюсь, включенный) php-parser, который не заботится об этих видах ошибок? Или, может быть, быстрый способ исправить «сломанный» html?
Решением для «исправления» разбитого HTML может быть использование HTMLPurifier (цитирование) :
HTML Purifier – это стандартная библиотека фильтров HTML, написанная на PHP.
HTML-очиститель не только удалит все вредоносные коды (более известные как XSS) с тщательно проверенным, безопасным, но разрешенным «белым списком», он также гарантирует, что ваши документы соответствуют стандартам
Альтернативной идеей может быть попытка загрузить ваш HTML с помощью DOMDocument::loadHTML
(цитирование) :
Функция анализирует HTML, содержащийся в источнике строки. В отличие от загрузки XML, HTML не должен быть хорошо сформирован для загрузки.
И если вы пытаетесь загрузить HTML из файла, см. DOMDocument::loadHTMLFile
.
Существует SimpleHTML
Для восстановления поврежденного HTML вы можете использовать Tidy .
В качестве альтернативы вы можете использовать собственный XML-ридер . Поскольку он действует как курсор, продвигающийся по потоку документа и останавливаясь на каждом узле на своем пути, он не будет разбиваться на недопустимые документы XML.
См. http://www.ibm.com/developerworks/library/x-pullparsingphp.html.
Любая конкретная причина, по которой вы все еще используете PHP 4 XML API?
Если вам удастся использовать XML API PHP 5, есть две возможности.
Сначала попробуйте встроенный анализатор HTML. Это действительно не очень хорошо (он, как правило, задыхается от плохо отформатированного HTML), но это может сделать трюк. Посмотрите на DomDocument :: LoadHTML.
Второй вариант – вы можете попробовать парсер HTML на основе спецификации парсера HTML5:
http://code.google.com/p/html5lib/
Это работает лучше, чем встроенный PHP-парсер PHP. Он загружает HTML в объект DomDocument.
Решением является использование 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.