Я пытаюсь проанализировать HTML-код с помощью DOMDocument, внести в него такие вещи, как изменения, а затем собрать его обратно в строку, которую я отправляю на вывод.
Но есть несколько проблем с синтаксическим анализом, а это означает, что то, что я отправляю в DOMDocument, не всегда возвращается в той же форме :)
Вот список:
с использованием ->loadHTML:
saveWhitespace
и formatOutput
(потеря пробелов в предварительно отформатированном тексте)
,
и т. д. Но их можно подавить, так что я могу с этим жить.Элемент
(с самозакрывающимся тегом), после синтаксического анализа/сохранения HTML вывод будет
с использованием ->loadXML:
>
из
или
теги: body > div
становится body > div
становится
; но это можно исправить с помощью регулярного выражения.Я не пробовал HTML5lib, но предпочел бы DOMDocument вместо пользовательского синтаксического анализатора из соображений производительности.
Таким образом, как упомянутый Honeymonster, использование CDATA устраняет основную проблему с loadXML.
Можно ли как-то предотвратить самозакрытие всех пустых тегов HTML, кроме определенного набора, без использования регулярного выражения?
Прямо сейчас у меня есть:
$html = $dom->saveXML($node);
$html = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){
// ignore only these tags
$xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', 'area', 'link', 'col', 'base', 'basefont', 'param' ,'meta');
// if a element that is not in the above list is empty,
// it should close like ` ` (for eg. empty ``)
return in_array($matches[1], $xhtml_tags) ? "<{$matches[1]}{$matches[2]} />" : "<{$matches[1]}{$matches[2]}>{$matches[1]}>";
}, $html);
, который работает, но он также будет выполнять замены в содержимом CDATA, чего я не хочу...