Я знаю. Это не правильный XML.
К сожалению, это часть работы по устранению ошибки в исходном коде php, которая использует libxml.
Функция php loadHTML перезаписывает флаги без предупреждения и без ошибок, поэтому, если вы передадите эти параметры, они никогда не перейдут в libxml.
PHPX loadXML делает не сделать ту же ошибку. Все флаги работают как положено. Так что я смотрю на использование loadXML в качестве замены на данный момент. К сожалению, loadXML не подходит для загрузки, скажем, фрагментов шаблона или виджетов, потому что он прекратит синтаксический анализ после одного корневого узла. Так что-то вроде ….
<!--My title snippet -->
<h1>${{ title }}</h1>
<h4>${{ subtitle }}</h4>
будет загружен только частично с помощью loadXML. Есть ли какая-либо опция, чтобы заставить парсер libxml продолжать работать? Или я должен требовать, чтобы все фрагменты были помещены в корневой узел?
Заметка
Я исследовал другие способы обойти ошибку. Например, используя LIBXML_USE_INTERNAL_ERRORS (true) или перехватывая и очищая предупреждения с помощью выходного буфера. Оба работают, но ни один из них не является удовлетворительным, поскольку они записывают предупреждения и ошибки в память, которая мне не нужна.
Соответствующий libxml2 функция xmlParseBalancedChunkMemory
. Единственное место, где я мог найти, где эта функция косвенно предоставляется API PHP, это DOMDocumentFragment::appendXML
.
$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendXML('<h1>H1</h1><h4>H4</h4>');
print $doc->saveXML($fragment);
Но если вы пытаетесь разобрать HTML, вы, скорее всего, столкнетесь с проблемами.
Других решений пока нет …