Я использую HTMLDom для управления строкой, а не с полной веб-страницей. Когда я использую saveHTML()
он автоматически doctype
теги doctype
и html
.
$str = 'frament containing html';
$str = utf8_encode($str);
$doc->LoadHTML($str);
...do stuff...
$str = $doc->saveHTML();
Каков правильный способ сохранить фрагмент HTML без автоматического включения дополнительных тегов. В противном случае; правильный метод для удаления этих дополнительных тегов?
Я использовал синтаксический анализатор html, чтобы избежать использования регулярных выражений, поэтому кажется немного интуитивно понятным, что нужно использовать их на выходе парсера.
PHPs DOMDocument восстанавливает документ, если вы загружаете HTML. Это означает, что он добавляет элементы html
и body
.
Поэтому вам нужно получить все узлы внутри body
и сохранить их как HTML.
$html = <<<'HTML'
<h1>Hello World</h1>
Text
<!-- comment -->
HTML;
$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXPath($dom);
$result = '';
foreach ($xpath->evaluate('/html/body/node()') as $node) {
$result .= $dom->saveHtml($node);
}
echo $result;
Вот еще один вариант, но он пока недоступен. PHP добавил параметры LIBXML_HTML_NOIMPLIED
и LIBXML_HTML_NODEFDTD
.
$dom->loadHtml($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
Первым лучшим вариантом будет обновление PHP. PHP 5.3 больше не поддерживается.
Второй вариант - использование DOMDocument :: saveXML ($ node, LIBXML_NOEMPTYTAG). Это создаст фрагмент XML (XHTML), но для большинства случаев этого должно быть достаточно.
Последним вариантом будет использование строковых функций.
Warning: DOMDocument::saveHTML() expects exactly 0 parameters, 1 given
. Мой сайт находится на сервере под управлением PHP 5.3.3