Ошибка Терпимый HTML/XML/SGML, анализирующий в PHP

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
5
задан Alan Storm 16 September 2008 в 16:01
поделиться

5 ответов

Интересно, если передача "плохого" HTML через Опрятный HTML могла бы помочь как первичная обработка? Мог бы быть достойный внимания, если можно заставить документ быть хорошо сформированным, возможно, Вы могли бы загрузить его как регулярный XML-файл с DomDocument.

2
ответ дан 13 December 2019 в 22:19
поделиться

@Twan Вам не нужен DTD для DOMDocument для парсинга пользовательского XML. Просто используйте DOMDocument->load(), и, пока XML правильно построен, он может считать его.

После того как Вы заставляете файлы быть правильно построенными, именно тогда можно начать смотреть на синтаксические анализаторы XML, перед этим Вы - S.O.L. Lok Alejo сказал, Вы могли посмотреть на ОПРЯТНЫЙ HTML, но похоже, что это характерно для HTML, и я не знаю, как это пошло бы с Вашими пользовательскими элементами.

Я не считаю регулярные выражения допустимым решением здесь

Пока у Вас нет отмеченности, которая могла бы быть Вашей единственной опцией. После того как Вы получаете документы тому этапу, затем Вы находитесь в ясном с функциями DOM.

1
ответ дан 13 December 2019 в 22:19
поделиться

Смотрите на Синтаксический анализатор в порте PHP Fit. Код является чистым и был первоначально разработан для загрузки грязного HTML, сохраненного Word. Это настроено для вытаскивания таблиц, но может легко быть adapated.

Вы видите источник здесь: http://gerd.exit0.net/pat/PHPFIT/PHPFIT-0.1.0/Parser.phps

Модульный тест покажет Вам, как использовать его: http://gerd.exit0.net/pat/PHPFIT/PHPFIT-0.1.0/test/parser.phps

1
ответ дан 13 December 2019 в 22:19
поделиться

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

Когда существует соответствие, функция для обработки того тега вызвана и возвращает "обработанный HTML". Если тот пользовательский тег был в другом пользовательском теге, чем родитель становится бездетным тем, что фактический HTML был вставлен вместо ребенка, и он будет подобран regexp и обработан при следующем повторении цикла.

Цикл заканчивается, когда нет никаких бездетных пользовательских тегов, которые будут согласованы. В целом это является повторяющимся (некоторое время цикл) и не рекурсивным.

0
ответ дан 13 December 2019 в 22:19
поделиться

Storm @Alan

Ваш комментарий к моему другому ответу получил меня к взглядам:

При загрузке файла HTML DOMDocument это, кажется, делает некоторый уровень ре очистки: хорошо отмеченность, НО требует, чтобы все Ваши теги были законными HTML-тэгами. Я ищу что-то, что делает первого, но не позже. (Alan Storm)

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

$code = str_replace("<pseudo-tag>", "<blink rel=\"pseudo-tag\">", $code);
// and then back again...
$code = preg_replace('<blink rel="(.*?)">', '<\1>', $code);

очевидно, тот код не будет работать, но Вы в общих чертах понимаете?

0
ответ дан 13 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: